Avatar billede alex15 Nybegynder
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
Avatar billede mcb2001 Nybegynder
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.
Avatar billede mcb2001 Nybegynder
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.
Avatar billede alex15 Nybegynder
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
Avatar billede alex15 Nybegynder
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
Avatar billede alex15 Nybegynder
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`)
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 11:36 #6
velbekommen
Avatar billede alex15 Nybegynder
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
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 12:22 #8
hvis du efter din GROUP BY indsætter HAVING "datofelt" > "ønsket dato"
Avatar billede alex15 Nybegynder
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
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 12:31 #10
velbekommen

Og god weekend til dig også
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