Avatar billede mecenor Nybegynder
15. april 2007 - 21:25 Der er 7 kommentarer og
1 løsning

Kun vise row med seneste dato

Hej, jeg har rodet rundt i forskellige måder at vise en row fra en tabel ud fra højeste/seneste dato og kan ikke finde ud af det. Mit seneste forsøg:

"SELECT tab1.id, tab1.navn, tab2.idtab1, tab2.dato " +
"FROM tab1 " +
"INNER JOIN tab2 ON tab1.id = tab2.idtab1 " +
"WHERE tab1.navn LIKE '%" + navn + "%'  AND tab2.dato IN (SELECT MAX(tab2.dato) FROM tab2)";

Det er muligt at det skal gøres på en helt anden måde, men hvordan?!
Avatar billede kjulius Novice
15. april 2007 - 22:32 #1
Det ser da umiddelbart ikke så forkert ud, bortset fra, at der ikke er grund til at bruge IN, da MAX funktionen uden uden GROUP BY altid kun vil returnere én row. Et lighedstegn ville være mere logisk.

Hvad er fejlen?

Muligvis er du også nødt til at gentage din INNER JOIN incl. WHERE i din subselect hvor du finder den sidste dato. Det kommer lidt an på, hvad du vil opnå. Hvis du vil vise den sidste dato, hvor navnekriteriet er opfyldt, er du i hvert fald nødt til at medtage det samme kriterie i subselecten. Så måske sådan?

"SELECT tab1.id, tab1.navn, tab2.idtab1, tab2.dato " +
"FROM tab1 " +
"INNER JOIN tab2 ON tab1.id = tab2.idtab1 " +
"WHERE tab1.navn LIKE '%" + navn + "%'  AND tab2.dato = (SELECT MAX(tab2.dato) FROM tab1 t1 INNER JOIN tab2 t2 ON t1.id = t2.idtab1 WHERE t1.navn LIKE '%" + navn + "%)";
Avatar billede kjulius Novice
15. april 2007 - 22:36 #2
Rettelse:  Der skal stå MAX(t2.dato), da jeg jo har sat alias til t1 og t2 i subselecten.
Avatar billede kjulius Novice
15. april 2007 - 23:01 #3
En anden mulighed var, hvis det du ønsker er den sidste dato for alle de rows der opfylder dit navnekriterie. Det vil så nok blive noget lignende dette:

"SELECT tab1.id, tab1.navn, tab2.idtab1, tab2.dato " +
"FROM tab1 " +
"INNER JOIN tab2 ON tab1.id = tab2.idtab1 " +
"WHERE tab1.navn LIKE '%" + navn + "%'  AND tab2.dato = (SELECT MAX(t2.dato) FROM tab2 t2 WHERE t2.idtab1 = tab1.id)";

Det kommer helt an på, hvad du egentlig ønsker:

* Den seneste dato registreret i tabellen.
* Den seneste dato, hvor navnekriteriet er opfyldt
* Den seneste dato, hvor hver enkelt af de på grundlag af navnekriteriet udvalgte rows blev registreret
Avatar billede mecenor Nybegynder
16. april 2007 - 01:07 #4
Jeg kunne nok have været mere præcis, beklager :)
Fejlen var, at der ikke blev returneret nogle rows, selvom der var nogle, der passede kriterierne.

Det jeg ønsker er "Den seneste dato, hvor hver enkelt af de på grundlag af navnekriteriet udvalgte rows blev registreret"

Med:
"SELECT tab1.id, tab1.navn, tab2.idtab1, tab2.dato " +
"FROM tab1 " +
"INNER JOIN tab2 ON tab1.id = tab2.idtab1 " +
"WHERE tab1.navn LIKE '%" + navn + "%' AND tab2.dato = (SELECT MAX(t2.dato) FROM tab2 t2 WHERE t2.idtab1 = tab1.id)";

får jeg alle rows med fx 'navn1' og ikke blot den med højeste dato. Jeg kan ikke lige se hvorfor, hvis MAX uden GROUP BY kun returnerer én row.
Avatar billede kjulius Novice
16. april 2007 - 20:43 #5
Jeg skal lige have den én gang mere for prins Knud. Er der mere end én row i tab2 for hver row i tab1, og du får alle kombinationerne (ikke bare den med den højeste dato)?

Du burde efter min bedste overbevisning kun få den seneste dato fra tab2 for hver række i tab1, som tilfredsstiller dit navnekriterie (det er jo den version du har valgt).
Gider du tjekke det én gang mere?
Avatar billede mecenor Nybegynder
16. april 2007 - 21:01 #6
Du har ret, det virker :) My bad. Tak for hjælpen, grundig og hurtig!
Avatar billede mecenor Nybegynder
30. april 2007 - 11:28 #7
Kom med et svar, kjulius :)
Avatar billede kjulius Novice
30. april 2007 - 21:20 #8
Okay så! :-)
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