Sorry voor de vage topictitel, maar dat is de beste manier waarop ik kan omschrijven waar ik naartoe wil.
Situatie
Ik heb een tweetal tabellen die relevant zijn voor dit probleem:
mdb_movie:
movie_id, movie_name, movie_genre, ... , enz
mdb_loan:
loan_id, loan_movie_id, loan_loaner_id, loan_date_loaned, loan_date_returned
loan_movie_id is referentiëel, en verwijst uiteraard naar de movie-tabel, en loan_loaner_id verwijst naar een andere tabel waar alle mensen in staan die een DVD kunnen lenen, maar die tabel is hier niet relevant.
Wanneer loan_date_returned de waarde NULL bevat, dan is een film uitgeleend; wanneer het veld een datum bevat, is de film teruggebracht.
Wat ik wil doen
Ik wil graag in mijn filmdatabase een lijst weergeven van al mijn films, waarbij alle films die ik op dit moment uitgeleend heb, dik gedrukt worden. Op zich geen probleem dacht ik, sterker nog, ik dacht dat ik het werkend had, maarrrrr:
Het probleem
Films die ik vaker dan één keer uitgeleend heb, komen ook vaker dan één keer terug in mijn filmlijst. Hier zie je een voorbeeld: de eerste film staat slechts één keer in mijn database, maar wordt twee keer weergegeven omdat ik mijn GROUP BY niet netjes krijg.
Mijn query ziet er als volgt uit:
Deze query heb ik enigszins versimpeld. Normaal zit er nog een order by clause bij, die sorteert op het veld dat de gebruiker gekozen heeft, en een limit clausule.
Nu is het probleem vrij logisch, aangezien ik groepeer op naam, en daarna ook op date_returned, maar als ik date_returned niet opneem in mijn query, dan krijg ik alleen de gegevens van de eerste keer dat een film is uitgeleend, terwijl ik juist de laatste wil hebben. Ik kan niets met order by doen, omdat er eerst gegroepeerd wordt, en daarna pas gesorteerd. Inner joins zijn ook zinloos omdat ik dan films die niet uitgeleend zijn niet terug krijg, en bovendien zou dat volgens mij het probleem niet oplossen.
Mijn vraag
Ziet een van jullie hoe ik mijn query in een MySQL versie zonder subqueries zo kan aanpassen dat ik maar één record per film terugkrijg, met daarin informatie over de laatste keer dat een film is uitgeleend?
Situatie
Ik heb een tweetal tabellen die relevant zijn voor dit probleem:
mdb_movie:
movie_id, movie_name, movie_genre, ... , enz
mdb_loan:
loan_id, loan_movie_id, loan_loaner_id, loan_date_loaned, loan_date_returned
loan_movie_id is referentiëel, en verwijst uiteraard naar de movie-tabel, en loan_loaner_id verwijst naar een andere tabel waar alle mensen in staan die een DVD kunnen lenen, maar die tabel is hier niet relevant.
Wanneer loan_date_returned de waarde NULL bevat, dan is een film uitgeleend; wanneer het veld een datum bevat, is de film teruggebracht.
Wat ik wil doen
Ik wil graag in mijn filmdatabase een lijst weergeven van al mijn films, waarbij alle films die ik op dit moment uitgeleend heb, dik gedrukt worden. Op zich geen probleem dacht ik, sterker nog, ik dacht dat ik het werkend had, maarrrrr:
Het probleem
Films die ik vaker dan één keer uitgeleend heb, komen ook vaker dan één keer terug in mijn filmlijst. Hier zie je een voorbeeld: de eerste film staat slechts één keer in mijn database, maar wordt twee keer weergegeven omdat ik mijn GROUP BY niet netjes krijg.
Mijn query ziet er als volgt uit:
SQL:
1
2
3
4
5
6
| SELECT mdb_movie.*, mdb_loan.loan_id, mdb_loan.loan_date_returned FROM mdb_movie LEFT JOIN mdb_loan ON movie_id = mdb_loan.loan_movie_id GROUP BY movie_name, loan_date_returned |
Deze query heb ik enigszins versimpeld. Normaal zit er nog een order by clause bij, die sorteert op het veld dat de gebruiker gekozen heeft, en een limit clausule.
Nu is het probleem vrij logisch, aangezien ik groepeer op naam, en daarna ook op date_returned, maar als ik date_returned niet opneem in mijn query, dan krijg ik alleen de gegevens van de eerste keer dat een film is uitgeleend, terwijl ik juist de laatste wil hebben. Ik kan niets met order by doen, omdat er eerst gegroepeerd wordt, en daarna pas gesorteerd. Inner joins zijn ook zinloos omdat ik dan films die niet uitgeleend zijn niet terug krijg, en bovendien zou dat volgens mij het probleem niet oplossen.
Mijn vraag
Ziet een van jullie hoe ik mijn query in een MySQL versie zonder subqueries zo kan aanpassen dat ik maar één record per film terugkrijg, met daarin informatie over de laatste keer dat een film is uitgeleend?
[ Voor 4% gewijzigd door NMe op 18-08-2005 00:30 ]
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.