24. januar 2004 - 18:44Der er
4 kommentarer og 1 løsning
Nyeste billede med GROUP BY
Jeg har en database over objeket, der er organiseret i en række kategorier. Hvert objekt har mindst et billede tilknyttet.
Nu vil jeg gerne konstruere et query der returnerer ét billede (picture_id) til det nyeste objekt (udfra date_of_entry) i hver kategori. Altså, fem kategorier=fem billeder..
Mine tabeller: Object (id, category_fk, date_of_entry) ObjectPicture (id, object_fk, picture_fk) Picture (id .. ) (teknisk set behøver den ikke være med, skal bare bruge picutre_fk)
Hvordan bikser jeg det sammen? Jeg forestiller mig noget med: SELECT MAX(ObjectPicture.picture_fk) AS picture_id,MAX(category_fk) AS category_id FROM Object, ObjectPicture, Picture WHERE ObjectPicture.object_fk=Object.id AND ObjectPicture.picture_fk = Picture.id GROUP BY category_fk;
Det giver mig et billede til hver kategori, men det er sorteret efter billedets id, ikke dato..
SELECT MAX(ObjectPicture.picture_fk) AS picture_id,MAX(category_fk) AS category_id FROM Object, ObjectPicture, Picture WHERE ObjectPicture.object_fk=Object.id AND ObjectPicture.picture_fk = Picture.id GROUP BY category_fk ORDER BY date_of_entry DESC
Det giver mig en fejl: Column name 'Object.date_of_entry' is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.
Så jeg group'er by date_of_entry: SELECT MAX(ObjectPicture.picture_fk) AS picture_id,MAX(category_fk) AS category_id FROM Object, ObjectPicture, Picture WHERE ObjectPicture.object_fk=Object.id AND ObjectPicture.picture_fk = Picture.id GROUP BY category_fk,date_of_entry ORDER BY date_of_entry DESC
Ingen fejl -- men nu får jeg samme category_id flere gange.. det ser ud til at jeg får et billede pr. unikke dato.. ?
Hvis jeg bruger datoen i en funktion i stedet: SELECT MAX(ObjectPicture.picture_fk) AS picture_id,MAX(category_fk) AS category_id, MAX(date_of_entry) AS date FROM Object, ObjectPicture, Picture WHERE ObjectPicture.object_fk=Object.id AND ObjectPicture.picture_fk = Picture.id GROUP BY category_fk,date_of_entry ORDER BY date_of_entry DESC
Det ser ud til at give samme resultat, bare med en dato på ..
select picture_fk from ObjectPicture join object on object.id = ObjectPicture.object_fk where object.date_of_entry in (select max(date_of_entry) from object)
Hvis flere objects kan have samme date_of_entry, kan du vælge en tilfældig af disse med
Jeg vil helst ikke bruge nestede SELECTs når det ikke er nødvendigt.
Anyway, jeg har løst det i Access' view-design.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.