Avatar billede r*nger Nybegynder
24. januar 2004 - 18:44 Der 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..

Hvad gør jeg?

VH Martin Seebach
Avatar billede nlsaeg Nybegynder
24. januar 2004 - 18:49 #1
Du kan brugr "order by date_of_entry desc"
Avatar billede r*nger Nybegynder
24. januar 2004 - 19:21 #2
Jeg prøver:

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å ..
Avatar billede eagleeye Praktikant
24. januar 2004 - 20:20 #3
Hvad med denne:

SELECT picture_fk, max(Object.date_of_entry)
FROM Object LEFT JOIN ObjectPicture ON Object.id = ObjectPicture.object_fk
GROUP BY Object.category_fk
Avatar billede Per-Johan Ørmen Nybegynder
27. januar 2004 - 06:32 #4
Prøv med følgende:
Prøv denne

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

select top 1 picture_fk
Avatar billede r*nger Nybegynder
27. januar 2004 - 14:13 #5
Jeg vil helst ikke bruge nestede SELECTs når det ikke er nødvendigt.

Anyway, jeg har løst det i Access' view-design.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester