Avatar billede hanzi_cool Nybegynder
17. februar 2004 - 18:00 Der er 12 kommentarer og
1 løsning

distinct + top

Hej,

Jeg er i gang med at lave en highscore til et lille spil, men jeg kan sku ikke få det til at funk'e...

Jeg har 2 tabeller:
1. User der indeholder userID og sName.
2. Game der indeholder iCorrectAnswers, iTime og userID


Jeg har prøvet med:
SELECT
    TOP 10 iCorrectAnswers,
    sName,
    iTime
FROM
    Game
LEFT JOIN
    tUser
ON
    tUser.userID = Game.userID
ORDER BY
    iCorrectAnswers DESC, iTime

ud af det får jeg:
30, john, 190
29, per, 180
10, john, 60
10, lis, 65


Dette virker helt perfekt...

Men nu skal en bruger kun få vist det bedste resultat på highscoren; så det skulle gerne ud sådan her:
30, john , 190
29, per , 180
10, lis, 65

Jeg har prøvet at rode mig ud i noget distinct værk, men jeg kan ikke få det til at virke :(

Help me plz!
Avatar billede arne_v Ekspert
17. februar 2004 - 18:12 #1
Prøv:

SELECT TOP 10 MAX(iCorrectAnswers), sName, iTime
FROM Game LEFT JOIN tUser ON tUser.userID = Game.userID
ORDER BY MAX(iCorrectAnswers) DESC, iTime
Avatar billede hanzi_cool Nybegynder
17. februar 2004 - 18:20 #2
Det virker ikke:
Column tUser.sName invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Column tUser.iTime invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

Og ville den være distinct?
Avatar billede arne_v Ekspert
17. februar 2004 - 18:22 #3
Ja.
Avatar billede arne_v Ekspert
17. februar 2004 - 18:23 #4
Vi må prøve med GROUP BY så:

SELECT TOP 10 MAX(iCorrectAnswers), sName, iTime
FROM Game LEFT JOIN tUser ON tUser.userID = Game.userID
GROUP BY sName,iTime
ORDER BY MAX(iCorrectAnswers) DESC, iTime
Avatar billede hanzi_cool Nybegynder
17. februar 2004 - 18:37 #5
Men den henter ikke distinct, den samme bruger er på 2 gange...
Avatar billede arne_v Ekspert
17. februar 2004 - 19:07 #6
Nej - iTime giver duplikater.
Avatar billede hanzi_cool Nybegynder
17. februar 2004 - 19:09 #7
Vil det siger at man ikke kan løse dette problem?
Avatar billede arne_v Ekspert
17. februar 2004 - 19:10 #8
Den må vendes lidt om.

Hvad med:

SELECT TOP 10 iCorrectAnswers, sName, iTime
FROM Game G1 LEFT JOIN tUser ON tUser.userID = Game.userID
WHERE iCorrectAnsweres = (SELECT MAX(iCorrectAnswers) FROM Game G2 WHERE G1.userID=G2.userID)
ORDER BY iCorrectAnswers DESC, iTime
Avatar billede arne_v Ekspert
17. februar 2004 - 19:11 #9
Jeg ar ikke givet op endnu.

:-)
Avatar billede hanzi_cool Nybegynder
17. februar 2004 - 19:21 #10
ARHHHHH... det er jo top liret mand!

Jeg elsker dig!
Avatar billede hanzi_cool Nybegynder
17. februar 2004 - 19:22 #11
hov... det var dig der skulle svare!
Avatar billede arne_v Ekspert
17. februar 2004 - 19:23 #12
svar
Avatar billede hanzi_cool Nybegynder
17. februar 2004 - 19:32 #13
oki dodi
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