Avatar billede ml Nybegynder
29. maj 2008 - 18:05 Der er 8 kommentarer og
1 løsning

GROUP BY problem

Lidt GROUP BY problemer her. Har aldrig helt fattet hvordan det virker i MSSQL (i modsætning til MySQL).

Jeg ønsker kun at få én row pr BandID med den nyeste Track, lige meget hvad der findes i de andre felter. Hvordan opnår jeg det? (I MySQL ville man bare nøjes med at GROUP BY Band.BandID)

SELECT
Band.BandID,
Band.BandName,
Track.TrackID,
Track.TrackName,
Track.TimeMade

FROM
Band,
Track

WHERE
Band.BandID = Track.BandID

GROUP BY
Band.BandID,
Band.BandName,
Track.TrackID,
Track.TrackName,
Track.TimeMade

ORDER BY
Track.TimeMade DESC
Avatar billede erikjacobsen Ekspert
29. maj 2008 - 18:07 #1
Så laver du en GROUP BY Band.BandID - men hvad vil du så have der skal stå i de andre felter - der er jo flere rækker at vælge mellem?
Avatar billede ml Nybegynder
29. maj 2008 - 18:40 #2
Problemet er at den ikke kun grouper på BandID, men også på de andre felter. Selvom et band har 3 tracks, vil jeg som sagt kun have en row pr band med bandets nyeste track. Jeg skal måske bygge det helt anderledes op?
Avatar billede erikjacobsen Ekspert
29. maj 2008 - 18:46 #3
Hvis du vil have det nyeste track, kan du vel gøre det på samme måde som i mysql. Det er timemade der afgør hvad der er nyest?
Avatar billede ml Nybegynder
29. maj 2008 - 18:53 #4
Ja, jeg vil have det nyest track pr band, men man kan jo netop ikke group by et enkelt felt (BandID) som man kan i MySQL, hvorfor man får en row pr track og ikke pr band.
Avatar billede erikjacobsen Ekspert
29. maj 2008 - 19:08 #5
Nåh, men i mysql får du jo bare "tilfældige" værdier fra de felter, der ikke er nævnt i din GROUP BY. Du får ikke med sikkerhed det nyeste. Og den slags udtræk har ikke noget med SQL at gøre, og er at regne for en (gammel) fejl i Mysql.
Avatar billede ml Nybegynder
29. maj 2008 - 22:12 #6
Ok. Har du nogen ide til hvordan jeg så laver et kald der returnere det jeg gerne vil have?
Avatar billede Syska Mester
30. maj 2008 - 00:31 #7
SELECT P.SID, P.Name FROM Servers S
INNER JOIN (SELECT P.SID, MAX(UID) AS [UID] FROM Players P GROUP BY P.SID) AS t1 ON S.SID = t1.SID
INNER JOIN Players AS P ON t1.SID = P.SID AND t1.UID = P.UID

Følgende tager den Player med det højeste ID ud fra hvor Server. I mit tilfælde er højeste ID, den som er blevet tilføjet sidst ... det samme burde du kunne gøre ... du kan så fikse lidt rundt med table navne etc.

Tør ikke lave det med dine, da jeg sikkert alligevel overser et eller andet ...

Håbe det virker .. :-)
Avatar billede ml Nybegynder
30. maj 2008 - 01:46 #8
buzzzz: Det ser du til at virker, points? :)
Avatar billede Syska Mester
30. maj 2008 - 11:33 #9
svar
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