namn poäng
kalle 100
lisa 90
berit 50
maria 50
lars 30
elin 5
Nu vill jag kunna plocka ut vilken placering en viss person har. Även om personer har exakt samma poäng ska de få olika placeringar, berit har alltså placering 3 men maria har placering 4.
Hur gör man? Har läst några trådar på wF om samma problem men de har haft ännu krångligare exempel så jag har inte lyckats få till det.
Alltså jag vill inte skriva placeringen brevid varje namn utan jag vill veta vilken placering just lars har t.ex. Så det är inte så bra att plocka ut alla och börja räkna.
En av andledningarna är i alla fall att om jag har en enormt stor lista som är uppdelad på flera sidor så vill jag kunna gå till den sida där användaren listas. Det kan jag göra om jag vet placeringen.
Om inte annat vore det kul att veta för det känns som ett ganska enkelt problem som ändå verkar väldigt svårt att lösa snyggt ;)
Du skulle ju kunna ha den where-sats du har nu, plus ett tillägg med folk som har samma poäng som du, fast ligger före i bokstavsordning. Det kan du göra med någon fin strängfunktion. :)
SELECT (
SELECT COUNT(*) FROM toplist t1
WHERE t1.points > t0.points OR (t1.points = t0.points AND t1.userid < t0.userid)
) + 1
, points, userid, username
FROM toplist t0
ORDER BY points DESC, userid
Den här kan du sen använda för att veta användarens position.
Lite som din kod fast här så rankas folk med lägre id högre än de med högre id och samma poäng.
Funkade utmärkt!
Den slutgiltiga koden för att plocka ut placering av ett visst namn blev alltså:
SELECT (
SELECT COUNT(*) FROM users t1 WHERE t1.points>t0.points OR
(t1.points = t0.points AND t1.username<t0.username)
)+1 from users t0 WHERE username='lars' ORDER BY points DESC,username;
261 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849