backerMedlem sedan feb. 200924 inlägg Har lite problem här som någon kanske kan hjälpa mig med. Jag vill få ut unika användare i en lista. Läste något om distinct skall lösa detta men får det ändå inte att fungera =/
Vill sortera på unika användare helt enkelt, såhär har jag försökt med men får ändå 2 spelare av playerId = 1
$sql = "SELECT DISTINCT playerId, scoreListId,scorePoints,scoreTime,scoreLevel,scoreName,scoreDate FROM myTestDb.tbl_highscores WHERE projectId = $projectId ORDER BY $type DESC, scoreDate ASC LIMIT $startIndex, $endIndex;";
Peter SMedlem sedan dec. 20025 483 inlägg Välkommen till wF!
Med Distinct får du unika rader i resultatet, inte enskilda kolumner.
Om du nu får dubbletter i resultatet måste du bestämma dig för vilken av de raderna du vill ha med och vilka du inte vill ha med. Så frågan är: om flera rader har samma playerId, vilken av dem vill du då visa?
backerMedlem sedan feb. 200924 inlägg Det jag är ute efter är en highscore som visar unika användare, så t.ex. om användare 2 har spelat 5ggr så vill jag bara ha med 1 post (den som har bäst poäng).
Detta borde väll ORDER BY lösa åt mig, så jag vill bara ha med varje användares första post.
Orginal exempel
Användare Id, poäng
1 200
1 190
2 185
1 140
Vill få ut
1 200
2 185
Peter SMedlem sedan dec. 20025 483 inlägg Okej, testa:
SELECT
h.playerId,
h.scoreListId,
h.scorePoints,
h.scoreTime,
h.scoreLevel,
h.scoreName,
h.scoreDate
FROM
myTestDb.tbl_highscores h
WHERE
h.projectId = $projectId AND
h.scorePoints = (select max(scorepoints)
from myTestDb.tbl_highscores
where playerid = h.playerid
and projectid = $projectId)
GROUP BY
h.playerId
ORDER BY
h.$type DESC,
h.scoreDate ASC
LIMIT
$startIndex, $endIndex
backerMedlem sedan feb. 200924 inlägg Det funkade ju fantastiskt.
Märkte dock ett litet problem, ifall en playerId har 2 poster med samma poäng (scorePoints), då syns båda. När jag lägger till en ny post med högre score så löser sig problemet.
Peter SMedlem sedan dec. 20025 483 inlägg Har du med GROUP BY enligt koden ovan?
backerMedlem sedan feb. 200924 inlägg Nu rullar det, satan i gatan va GRYM du är, tack så hemskt mycket.
backerMedlem sedan feb. 200924 inlägg hmm, jag förstår mig helt enkelt inte på SQL =(
Försökte använda mig utav det som du klurade ut för att få ut en rank position när man postar sitt resultat.
Så när man skickar poäng så vill jag få tillbaka att man är t.ex. på 5;e plats. Är det inte exakt samma sak förutom att jag måste räkna på att jag vill bara ha poster som är >= poängen
h.scorePoints >= $value AND
SELECT COUNT(h.scoreId)
FROM myTestDb.tbl_highscores h
WHERE h.projectId = $projectId AND
h.scorePoints >= $value AND
h.scorePoints = (select max(scorepoints)
from myTestDb.tbl_highscores
where playerId = h.playerId and
projectId = $projectId)
GROUP BY h.playerId
ORDER BY h.$type DESC, h.scoreDate ASC;";
Peter SMedlem sedan dec. 20025 483 inlägg Några saker att fundera på:
-
Om en spelare har flera olika resultat, vill du då få ut rankingen för $value eller för personen? (Jag kanske tidigare har ett resultat som gör att jag ligger 1:a, men $value i denna omgång kanske innebär en 5e-plats.)
-
Om det finns flera poäng som är lika, vad skall gälla då? Säg att vi har följande tabell:
Spelar-Id - Poäng
-----------------
1 - 200
2 - 200
3 - 199
4 - 198
...
Ligger då spelare 2 på första eller andra plats?
backerMedlem sedan feb. 200924 inlägg det beror på datumet, den som sätter score först är den som har ledningen.
backerMedlem sedan feb. 200924 inlägg kanske inte var så tydlig i svaret :)
tänkte att listningen av position(rank) är egentligen densamma som du hjälpte med innan när man får ut en lista. Man vill helt enkelt få var hamna jag i den listan.
Högre upp på listan är poäng & datum
Peter SMedlem sedan dec. 20025 483 inlägg Loopar du ut listan? I sådana fall kan du lösa det i applikationen med en räknare som håller reda på var i recordsetet du är, typ:
i = 1
while not rs.eof
print rs(0) + ", position = " + i
i = i + 1
rs.getnext()
end while
backerMedlem sedan feb. 200924 inlägg Hänger inte riktigt med.
Men då måste jag plocka ut alla poster med den första SQL satsen du hjälpte mig med. Sedan loopa tills jag hittar poäng + användarId match. När highscore får in massor av poster kommer det bli kanontungt :(
Man vill ju ha ut antalet unika spelare åvan en själv med högre score.
backerMedlem sedan feb. 200924 inlägg Något sådant här kanske.
SELECT COUNT(h.scoreId)
FROM myTestDb.tbl_highscores h
WHERE h.projectId = $projectId AND
h.scorePoints >= $value
GROUP BY h.playerId
ORDER BY h.$type DESC, h.scoreDate ASC;
backerMedlem sedan feb. 200924 inlägg försökt och testa en liten stund nu och verkar rulla.
Återigen tack så mycket Peter. :) ovärderlig hjälp!