Avatar billede billen Nybegynder
25. juni 2004 - 00:17 Der er 9 kommentarer og
1 løsning

Hjælp til SELECT sætning

Jeg prøver at lave en SELECT sætning, som arbejder på følgende dataset: http://frank-bille.dk/exp/data.txt

Ud fra disse data vil jeg gerne konstruere en SELECT sætning der kan returnere data sådan: http://frank-bille.dk/exp/resultat.txt

Forklaret med ord, skal den kun returnere en række per ID og da der kan være flere rækker med samme ID, skal den række med højest værdi i feltet Version vælges.

Jeg bruger MySQL 4.0 så subqueries kan desværre ikke komme på tale.
Avatar billede jensgram Nybegynder
25. juni 2004 - 00:21 #1
SELECT DISTINCT ID, Version, Felt1, Felt2 FROM DATA ORDER BY ID ASC, Version DESC

måske...
Avatar billede jensgram Nybegynder
25. juni 2004 - 00:22 #2
eller er det:

SELECT ID, Version, Felt1, Felt2 FROM DATA GROUP BY ID ASC ORDER BY ID ASC, Version DESC

jeg får altid brygget alt for meget på, men mon ikke en af dem kan give et praj?
Avatar billede billen Nybegynder
25. juni 2004 - 00:27 #3
Jeg har prøvet rigtig mange forskellige kombinationer. Deriblandt varianter af dine to forslag.

Problemet er at den første resulterer alle rækkerne, mens den anden rigtigt nok kun returnere en ID en gang, men det er den med den mindste værdi i Version.
Avatar billede billen Nybegynder
25. juni 2004 - 00:29 #4
Derudover har jeg prøvet med HAVING, samt at joine tabellen på sig selv (LEFT JOIN). Jeg kan ikke lige gennemskue om man med andre slags joins kan løse problemet; derfor dette spørgsmål :o)
Avatar billede jensgram Nybegynder
25. juni 2004 - 00:31 #5
Hmm, så er vi vist over mine evner. Held og lykke - jeg vil rende i seng ;)
Avatar billede codebase Praktikant
25. juni 2004 - 00:48 #6
SELECT DISTINCT ID, MAX(Version) AS maxVersion, Felt1, Felt2 FROM DATA GROUP BY ID ASC ORDER BY ID ASC, Version DESC

Ja i er jo tæt på :)
Avatar billede billen Nybegynder
25. juni 2004 - 00:54 #7
codebase: Det fungerer ikke. ID og maxVersion er ganske rigtige, men Felt1 og Felt2 er stadigvæk forkerte eftersom det er dem der passer til række med den mindste værdi af Version.
Avatar billede arne_v Ekspert
25. juni 2004 - 07:35 #8
Opgaven kan så vidt jeg ved ikke løses med en enkelt query i MySQL 4.0.

Du bliver nødt til først at lave:

SELECT MAX(Version),ID FROM DATA GROUP BY ID

og gemme resultatet i en temporær tabel og derefter joine den originale
tabel med den temporære tabel på både ID og Version.
Avatar billede proaccess Nybegynder
25. juni 2004 - 08:12 #9
Selvfølgelig kan opgaven løses...

SELECT A.ID, A.Version, A.Felt1, A.Felt2
FROM DATA AS A INNER JOIN DATA AS B ON A.ID=B.ID
GROUP BY A.ID, A.Version, A.Felt1, A.Felt2
HAVING Max(B.Version)=A.Version
Avatar billede billen Nybegynder
25. juni 2004 - 10:18 #10
proaccess: Det var lige det der skulle til. INNER JOIN! Jeg må nok lige tilbage og læse igen hvad den gør :o)

Tak for det.
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

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