webForumDet fria alternativet

Distinct Highscore

17 svar · 667 visningar · startad av backer

backerMedlem sedan feb. 200924 inlägg
#1

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
#2

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
#3

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
#4

Använder du MySQL?

backerMedlem sedan feb. 200924 inlägg
#5

Yes, MYSQL. =)

Peter SMedlem sedan dec. 20025 483 inlägg
#6

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
#7

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
#8

Har du med GROUP BY enligt koden ovan?

backerMedlem sedan feb. 200924 inlägg
#9

Nu rullar det, satan i gatan va GRYM du är, tack så hemskt mycket.

Peter SMedlem sedan dec. 20025 483 inlägg
#10

Kanon! :bire

backerMedlem sedan feb. 200924 inlägg
#11

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
#12

Några saker att fundera på:

  1. 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.)

  2. 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
#13

det beror på datumet, den som sätter score först är den som har ledningen.

backerMedlem sedan feb. 200924 inlägg
#14

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
#15

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
#16

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
#17

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
#18

försökt och testa en liten stund nu och verkar rulla.
Återigen tack så mycket Peter. :) ovärderlig hjälp!

128 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)