29. oktober 2010 - 08:57
Der er
9 kommentarer og 1 løsning
Group BY & ORDER BY sammen?
Hej Eksperter, Jeg er igang med at lave et udtræk fra en database som ser ud på følgende måde: SELECT * FROM `xxx`, `yyy` WHERE (`xxx`.`membership` = `yyy`.`membership`) ORDER BY `xxx`.`id` ASC, `xxx`.`firstname` DESC, `xxx`.`lastname` DESC, `yyy`.`expiryend` = '0000-00-00', `yyy`.`expiryend` DESC Ovenstående kode, giver nedenstående "RIGTIGE" resultat: ID - MEMBERSHIP - FIRSTNAME - LASTNAME - EXPIRYDATA: 1 - 1 - alex - chri - 2012-01-01 1 - 1 - alex - chri - 2010-01-01 1 - 1 - alex - chri - 2009-01-01 3 - 2 - lars - hans - 0000-00-00 3 - 2 - lars - hans - 2010-01-01 3 - 2 - lars - hans - 2009-01-01 4 - 1 - Ida - solle - 2012-01-01 5 - 4 - Sven - ole - 0000-00-00 Mit spørgsmål ligger i hvordan jeg sørger for at den kun viser hver ID én gang? Så den altså kommer med følgende resultat: 1 - 1 - alex - chri - 2012-01-01 3 - 2 - lars - hans - 0000-00-00 4 - 1 - Ida - solle - 2012-01-01 5 - 4 - Sven - ole - 0000-00-00 Nogle der har et forslag? Alex
Annonceindlæg fra Computerworld it-jobbank
29. oktober 2010 - 10:41
#1
du kan bruger FIRST eller MAX på datoen, så får du kun den første. Det skal du så bruge sammen med GROUP BY på navnet.
29. oktober 2010 - 10:42
#2
ORDER BY kan du så smide oven i, da ORDER BY først virker når data er trukket. ORDER BY sorterer altså først data når de har udvalgt de data der skal præsenteres.
29. oktober 2010 - 10:55
#3
Okay, hvordan ville du foreslå koden skulle se ud? Deler den lige lidt mere op, så det bliver mere overskueligt. ################### ### Oprindelig kode ### ################### SELECT * FROM `xxx`, `yyy` WHERE (`xxx`.`membership` = `yyy`.`membership`) ORDER BY `xxx`.`id` ASC, `xxx`.`firstname` DESC, `xxx`.`lastname` DESC, `yyy`.`expiryend` = '0000-00-00', `yyy`.`expiryend` DESC ##################### ### Forslag til ny kode ### ##################### SELECT * FROM `xxx`, `yyy` WHERE (`xxx`.`membership` = `yyy`.`membership`) && (`yyy`.`expirystart` = FIRST || `yyy`.`expirystart` = MAX) ORDER BY `xxx`.`id` ASC, `xxx`.`firstname` DESC, `xxx`.`lastname` DESC Eller hvordan havde du tænkt? Alex
29. oktober 2010 - 11:14
#4
Fedt !!! Fik det til at lykkes. Nu burde jeg have nok informationer til at gå videre. Tak for hjælpen. #################### ### Afsluttende kode ### #################### SELECT * FROM `xxx`, `yyy` WHERE `xxx`.`membership` = `yyy`.`membership` GROUP BY `xxx`.`id` ORDER BY `xxx`.`id` ASC, `xxx`.`firstname` DESC, `xxx`.`lastname` DESC ########## ### END ### ########## Håber andre kan bruge overstående til noget. PS. Laver du lige et svar så du kan få dine point mcb2001? Ha en god dag. Alex
29. oktober 2010 - 11:15
#5
Rettelse i ovenstående: * Skal i stedet være: `xxx`.`id`, `xxx`.`membership`,`xxx`.`firstname`, `xxx`.`lastname`, `yyy`.`membership`, MIN(`yyy`.`expiryend`), MAX(`yyy`.`expiryend`)
29. oktober 2010 - 11:36
#6
velbekommen
29. oktober 2010 - 12:06
#7
Har lige et ekstra spørgsmål - hvis du lyster? :-) Kan man lave et udtræk fra databasen så man får den første værdi over 2010-01-01? Ligesom man kan lave den laveste eller højeste værdi? Alex
29. oktober 2010 - 12:22
#8
hvis du efter din GROUP BY indsætter HAVING "datofelt" > "ønsket dato"
29. oktober 2010 - 12:29
#9
Hvad mere kan man forlange? 1.000 Tak for hjælpen & god weekend når du kommer så langt. Alex
29. oktober 2010 - 12:31
#10
velbekommen Og god weekend til dig også
Computerworld tilbyder specialiserede kurser i database-management