Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Many-to-many Select

AnttiJN [19.07.2005 13:33:54]

#

Miten olisi yksinkertaisinta (vähiten kyselyjä) tehdä seuraavanlainen mysql juttu.

Lähtötilanteena on kaksi taulua, jotka ovat toisiinsa many-to-many suhteessa seuraavasti:

taulu levyt: levy_id # nimi # paivitetty
taulu biisit: biisi_id # kappaleet # paivitetty
taulu levyt_biisit: levy_id # biisi_id # paivitetty

Jos nyt haluan listata samalle sivulle kaikki taulun "levyt" tietueet sekä aina levyn nimen alle kaikki tähän liittyvät biisit niin miten tämä tapahtuu?

Eli onnistuuko tuollainen yhdellä ainoalla kyselyllä? Sain kyllä helposti tuon tulostumaan niin, että ensimmäisenä valittu biisi tulostui aina levyn otsikon alle, mutta en keksinyt miten kyselyn saisi tulostamaan kaikki levyyn liittyvät biisit.

Useammalla tuo toki onnistuu, mutta varsinainen kyselyni tulee olemaan paljon monimutkaisempi ja sisältää usempia tauluja sekä suhteita.

ajv [19.07.2005 14:57:46]

#

Jos nyt käsitin ongelmasi oikein:

SELECT
   levyt.nimi,
   biisit.kappale
FROM
   levyt
LEFT JOIN
   levyt_biisit AS liitos ON levyt.id = liitos.levy_id
LEFT JOIN
   biisit ON liitos.biisi_id = biisi.id
ORDER BY
   levyt.id ASC, biisi.id ASC

Sitten tulostusloopissa vain tarkkailet milloin levy vaihtuu.

AnttiJN [20.07.2005 10:19:00]

#

Jeps hyvin tuntuu toimivan useammankin many-to-many suhteessa olevan taulun kanssa.

Ei vain tullut mieleen tuollainen tulostusvaiheessa tuloksien rajaaminen. Aikaisemmin kyllä sain (vähän monimutkaisemmin eli huonommin tehdyllä) kyselyllä vastaavan tulostuksen aikaiseksi, mutta tuo rajaaminen ei jostain syystä tullut mieleen.

Kiitokset avusta!

AnttiJN [22.07.2005 10:08:57]

#

Jatkan nyt tähän samaan ketjuun ettei tarvitse selittää niin paljon.

Eli ongelmana on nyt tuohon samaan kyselyyn tuleva sivutus. Olen yleensä käyttänyt pienillä muutoksilla Antti Laaksosen koodivinkeistä löytyvää sivutusta, mutta tähän kyselyyn tuo ei sovi. Ongemahan on se, että tuo koodivinkin sivutus perustuu myslin LIMIT lauseeseen.

Haluaisin sivuttaa yllä olevan kyselyn tulokset luonnollisesti levyjen mukaan, mutta tuo LIMIT lauseella tehty sivutus saattaa katkaista levyn tulostuksen kesken.

Tein väliaikaisen ratkaisun, joka sivuttaa käyttäen WHERE lausetta ja rajaamalla levy_id:n mukaan.

AND (levyt.levy_id BETWEEN ".($sivu * 100)." AND ".($sivu * 100 + 100).")

Tuota sitten selataan ihan napeilla "Edellinen" ja "Seuraava".

Ongelmana on tietysti se, että id nyt voi olla periaatteessa mitä vaan ja noita tietueita kuitenkin tippuu välillä välistä.

Eli onko joku tapa saada tuo paremmin toimiva LIMIT käyttöön tuollaisessa kyselyssä?

Vastaus

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

Tietoa sivustosta