Ongelmana taas vaihteeksi tiedon tulostus. Minulla on kannassa seuraaavan laista dataa
kat1|kat2|data aaaa|xxxx|d1 aaaa|xxxx|d2 aaaa|yyyy|d3 aaaa|zzzz|d1 aaaa|zzzz|d3 bbbb|qqqq|d1
Saanko yhdellä sql kyselyllä mitenkään tulostettua noita näin:
aaaa xxxx d1|d2|- yyyy -|-|d3 zzzz d1|-|d3 bbbb qqqq d1|-|- jne
Täytyy varmaan tehä toinen kysely looppi loopin sisään? vai joka laatikkoon oma kysely?
Tuossa on siis yhdenlainen taulukko jossa on kategoria1:llä omataulu jossa on kategoria2 mukaan järjestetty 3 mahdollista dataa ja pitäisi saada tyhjä ruutu jos esim d1 ei siinä kategoria2 :ssa ole.
Tosi hankala selittää vaihteeksi. :)
Mod. laittoi kooditagit.
Mihin toista kyselyä tarvit?
Eikös se onnistu ihan normaalisti tällä kyselyllä.
SELECT * FROM taulu
Sitten tallennat noi johonkin taulukkoon ja php:llä järjestät ja tulostat ne oikein.
Edit. PHP:llä, siis jos käytät PHP:tä.
En kyllä mitenkään keksi miten tuossa voisi tarvita useamman kyselyn, ainakaan jos on tiedossa että sarakkeet voi olla vain d1, d2 tai d3
<% var sarakkeet = new string[] { "d1", "d2", "d3" }; foreach (var kat1 in db.taulu.GroupBy(a=>a.kat1)) { %><%: kat1%><br /><% foreach (var kat2 in kat1.GroupBy(a=>a.kat2)) { %><%: kat2%><br /> <%: string.Join("|", (from s in sarakkeet select kat2.Any(a=>a.data == s) ? s : "-")) %><br /><% } } } %>
Jos mahdolliset sarakkeet (d1,d2 jne) ei ole ennestään tiedossa, ja halutaan ne vaikka aakkosjärjestyksessä, niin voidaan tosiaan hakea taulun sisältö paikalliseen taulukkoon (alla esimerkissä muuttuja tauluData)
<% var tauluData = db.taulu.ToArray(); var sarakkeet = tauluData.Select(a=>a.data).Distinct().OrderBy(a=>a).ToArray(); foreach (var kat1 in tauluData.GroupBy(a=>a.kat1)) { %><%: kat1%><br /><% foreach (var kat2 in kat1.GroupBy(a=>a.kat2)) { %><%: kat2%><br /> <%: string.Join("|", (from s in sarakkeet select kat2.Any(a=>a.data == s) ? s : "-")) %><br /><% } } } %>
Ihan samanlaista asiaa kysyttiin jo äskettäin.
SELECT t0.kat1, t0.kat2, IFNULL(t1.data, "-") AS d1, IFNULL(t2.data, "-") AS d2, IFNULL(t3.data, "-") AS d3 FROM taulu AS t0 LEFT JOIN taulu AS t1 ON t0.kat1 = t1.kat1 AND t0.kat2 = t1.kat2 AND t1.data = "d1" LEFT JOIN taulu AS t2 ON t0.kat1 = t2.kat1 AND t0.kat2 = t2.kat2 AND t2.data = "d2" LEFT JOIN taulu AS t3 ON t0.kat1 = t3.kat1 AND t0.kat2 = t3.kat2 AND t3.data = "d3" GROUP BY t0.kat1, t0.kat2
Joka tapauksessa joudut jollain tavalla käsittelemään tietoa tulostusvaiheessa (esim. jättämään toistuvat aaaa:t pois ja lisäämään sisennyksen), koska SQL-kysely palauttaa ainoastaan rivejä, joilla on kaikilla samat sarakkeet, eli et voi mitenkään saada suoraan kyselystä tulokseksi puuta. Sen takia onkin aika turhaa käyttää tällaista hidasta kyselyä; kannattaa vain käyttää tavallista yhden taulun kyselyä ja ryhmitellä data jälkikäteen.
Täytyy tutkia noita Metabolix:n ja Grezin ehdotuksia, ei ymmärrä suoraan tuosta koodista miten tuo toimii. Kiitos.
Mutta tosiaan on tarkoitus saada määrämuotoinen taulukko jossa data tulostuu omaan laatikkoon ja jos sitä riviä ei ole ko kategoriassa tulee tyhjä laatikko ja koska riviä ei ole niin sen tyhjän laatikon tulostus samassa loopissa on aika vaikeaa..
en ehkä osaa selittää tätä tarpeeksi hyvin.
Mielestäni osasit selittää ihan tarpeeksi hyvin. Lähinnä jäi auki, että mikä oikeastaan on ongelma.
lähinnä se sarakkeisiin datan saaminen. eli d1 ja d3 ei saa olla vierekkäin jos d2 riviä ei olekkaan.
mut koitan näillä tiedoilla tätä selvitellä kun tässä kerkiää taas koodailla.
Kiitos taas! kyllä tää putka on parasta.
creepy kirjoitti:
lähinnä se sarakkeisiin datan saaminen. eli d1 ja d3 ei saa olla vierekkäin jos d2 riviä ei olekkaan.
Käytännössä joudut määrittämään ne sarakkeet johonkin kiinteästi (kuten esim. tuossa Metabolixin kyselyesimerkissä tai minun 1. esimerkissä) tai dynaamisesti (2. esimerkissäni) ja sitten katsomaan mihin niistä löytyy jotain ja mihin ei. Sen voi
1) tehdä tietokannassa kyselyllä (Metabolixin esimerkki) tai
2a) ohjelmassa joko sitä mukaa kun rivejä haetaan ja tulostaa tuloksen kun ryhmä(t) vaihtuu ja kun data loppuu tai
2b) noin kuin esimerkeissäni on, että datan käsittely tehdään tulostavassa ohjelmassa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.