Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: yksi vai useampi kantakysely?

Sivun loppuun

creepy [22.02.2013 08:08:20]

#

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.

dartvaneri [22.02.2013 08:40:52]

#

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ä.

Grez [22.02.2013 08:46:55]

#

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 /><%
            }
        }
    }
%>

Metabolix [22.02.2013 08:49:54]

#

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.

creepy [22.02.2013 08:59:56]

#

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.

Grez [22.02.2013 09:10:14]

#

Mielestäni osasit selittää ihan tarpeeksi hyvin. Lähinnä jäi auki, että mikä oikeastaan on ongelma.

creepy [22.02.2013 09:15:55]

#

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.

Grez [22.02.2013 10:43:46]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta