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.
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.
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!
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ä?
Aihe on jo aika vanha, joten et voi enää vastata siihen.