Avatar billede ml Nybegynder
12. juli 2002 - 12:04 Der er 12 kommentarer og
1 løsning

Group By - Order By

Er sikker på andre også har haft dette problem.

Jeg skal skrive de 10 nyeste indlæg ud, men fra unikke brugere. Den samme bruger må altså ikke være mellem de 10 mere end en gang. Det klassiske "Group By og Order By sammen" problem.

Ville se ud som følger, hvis man kunne gøre det sådan :]

Sql = "SELECT * FROM forum_posts WHERE forumid='1' GROUP BY userid ORDER BY time_made DESC LIMIT 10"
Avatar billede ztyxx Nybegynder
12. juli 2002 - 12:10 #1
mon ikke det er sådan


Sql = "SELECT * FROM forum_posts WHERE forumid='1' GROUP BY userid ORDER BY time_made DESC LIMIT 0,10"
Avatar billede ml Nybegynder
12. juli 2002 - 12:17 #2
Nej - Man kan jo ikke bruge Group By og Order By i samme sætning - det er det der er hele problemet ;)

For øvrigt behøver man ikke have "0," på limit hvis det bare skal være de 10 første...
Avatar billede gryn Nybegynder
12. juli 2002 - 12:17 #3
Sql = "SELECT DISTINCT * FROM forum_posts WHERE forumid='1' GROUP BY userid ORDER BY time_made DESC LIMIT 10"
Avatar billede ztyxx Nybegynder
12. juli 2002 - 12:25 #4
du kan da godt bruge GROUP BY og ORDER BY i samme query, men hvis du vil have at DESC skal have effekt i begge, skal den også defineres begge steder
Avatar billede gryn Nybegynder
12. juli 2002 - 12:29 #5
Glem det jeg skrev. Jeg tror ikke, det virker. Dog tror jeg stadig du skal bruge DISTINCT
Avatar billede ml Nybegynder
12. juli 2002 - 12:53 #6
gryn > Det virker til dels.. Den hopper bare nogle over.

Skal man ikke fortælle den at det er "userid" der skal være DISTINCT. Eller det gør GROUP BY måske ?

ztyxx > Det er vel ligemeget, så længe de nyeste kommer først.
Avatar billede morw Nybegynder
12. juli 2002 - 13:13 #7
SELECT id, userid, titel, max(time_made) as tiden
FROM forum_posts
WHERE forumid='1'
GROUP BY userid
ORDER BY tiden DESC LIMIT 10

Kender ikke lige navnene på dine felter, men undgå SELECT *
Avatar billede ml Nybegynder
10. januar 2003 - 15:23 #8
Virker ikke, har lavet det på anden vis...
Avatar billede morw Nybegynder
10. januar 2003 - 16:08 #9
På hvilken vis?
Avatar billede ml Nybegynder
10. januar 2003 - 16:25 #10
Nåå ja, sorry.

Kører dem ud i en streng og laver en inStr for at tjekke om de allerede er vist.
Avatar billede tmi Nybegynder
19. december 2007 - 04:40 #11
Du skal gøre sådan her:

SELECT userid, felt2, felt3, felt4, MAX(time_made) time_made FROM forum_posts WHERE forumid='1' GROUP BY userid ORDER BY time_made DESC LIMIT 10

Så får du den unikke række med størst time_made.. Altså hvis jeg har skrevet 3 indlæg hvor 2 af dem er blandt de 10 nyeste så får du kun mit nyeste

Tror også du kan bruge din * ;-) :
SELECT *, MAX(time_made) time_made FROM forum_posts WHERE forumid='1' GROUP BY userid ORDER BY time_made DESC LIMIT 10
Avatar billede tmi Nybegynder
19. december 2007 - 04:53 #12
Øv, jeg troede det virkede..
Jeg var desværre bare heldig de gange jeg testede det :-(
Men vil gerne have løsningen på problemet ;-P
Avatar billede tmi Nybegynder
19. december 2007 - 05:19 #13
Her er en mulighed:

SELECT * FROM forum_posts WHERE forumid='1' AND time_made = (SELECT MAX(time_made) FROM forum_posts p2 WHERE p2.userid = userid) GROUP BY userid ORDER BY time_made DESC LIMIT 10

PS. Det er en god ide at sortere efter en auto_increment-kolonne i stedet for et timestamp ;-) Så er du 100% sikker på at det er sorteret efter seneste!
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