Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kategoriataulu ja listaustaulu yhteen

Merri [23.02.2006 23:48:44]

#

Minulla on MySQL-tietokannassa pari taulua, joista toisessa on ID ja description -kentät, toisessa taas on useita rivejä, joille on merkattu category:ksi jokin edellä mainitun taulukon rivi. Tällä hetkellä teen kutsun käyttäen LEFT JOINia, mutta tämä palauttaa käytännöllisesti katsoen lähes kaikki rivit taulusta yhdistäen kategoriataulun tietoja jokaiselle listariville. Tarvitsisin vain yhden kutakin kategoriaa edustavan rivin listataulusta.

Onnistuuko tämä mitenkään yhdellä ainoalla kutsulla? MySQL:n dokumentaatiosta ei löytynyt mitään sopivalta haiskahtavaa.

Antti Laaksonen [24.02.2006 00:12:48]

#

Ryhmittely GROUP BY voisi toimia:

SELECT kategoria, nimi FROM lista GROUP BY kategoria

Nyt jokainen esiintyvä kategoria tulee vain kerran. Tämän voi myös yhdistää siihen toiseen tauluun.

Mikä monista saman kategorian riveistä pitäisi valita?

Merri [24.02.2006 00:19:56]

#

Jep, kiitos, GROUP BY toimi. En ollut koskaan aiemmin tarvinnut sitä enkä ymmärtänyt sen merkitystä. Nyt pitäisi vielä yrittää sisäistää miten se tarkalleen toimii. Ainakin nyt ajatus "yksi kutakin tämän kentän arvoa" ei oikein sovi yhteen sanan "GROUP" kanssa, sehän tarkoittaa ryhmittelemistä.

Antti Laaksonen [24.02.2006 00:28:16]

#

Ehkä tuo olisi suomeksi "ryhmittely kategorian mukaan". Usein tällaiseen kyselyyn liitetään jokin kaikkia ryhmään kuuluvia rivejä koskeva koostefunktio. Esim.

SELECT kategoria, COUNT(*) FROM lista GROUP BY kategoria

Tämä ilmoittaa, kuinka monta riviä kussakin kategoriassa on.

Merri [24.02.2006 00:33:30]

#

Jep, löysin juuri vastaavanlaisen selityksen Googlella ja sulattelen sitä. Käytännössä se siis luo ryhmät kentän eriarvoisista riveistä, jotka ilmeisesti järjestyvät ORDER BY:llä ryhmän sisäisesti siten, että vain ylin rivi sitten tulee mukaan kun käytetään LEFT JOINia toiseen tauluun.

Jos joku sattuu joskus hakemaan eikä pysy sepittelyjen perässä ja ongelma on vastaava, niin toimiva koodi on tätä tyyliä:

$sql = 'SELECT s.id, s.description, s.shortdesc, d.date, d.odate, d.title, d.extension
	FROM '.$table['special'].' as s
	LEFT JOIN '.$table['data'].' as d ON s.id = d.special
	WHERE d.islive = 1
	GROUP BY d.special
	ORDER BY s.shortdesc, d.date';

Eri asia sitten onko tässä vielä jotakin parennettavaa (nopeusmielessä).

Vastaus

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

Tietoa sivustosta