M@rtinMedlem sedan dec. 19991 214 inlägg
Jag har en tabell (mysql) med namn och poäng:
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.
@ndersMedlem sedan juni 200026 914 inlägg
Kan du inte lösa det i presentationen?
M@rtinMedlem sedan dec. 19991 214 inlägg
Det kan jag väl antagligen men inte effektivt.
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.
@ndersMedlem sedan juni 200026 914 inlägg
Ok, då förstår jag lite mer.
*tänker*
@ndersMedlem sedan juni 200026 914 inlägg
Spontan tanke (utan att kunna det minsta om mysql):
Skapa en temporär tabell med en räknare.
Stoppa in alla poster i den temporära tabellen.
Hämta ut rätt post.
Finns säkert betydligt finare lösningar...
M@rtinMedlem sedan dec. 19991 214 inlägg
Hmm ja det skulle väl funka fast jag vet inte hur man skapar temporära tabeller och det känns som att gå över ån efter vatten.
Om man inte behöver göra skillnad på personer med samma poäng så är det ju bara att göra typ såhär:
SELECT COUNT(*) FROM toplist WHERE points > (SELECT points FROM toplist WHERE username='lars');
@ndersMedlem sedan juni 200026 914 inlägg
Ja. Varför ska du förresten göra skillnad på folk med samma poäng?
M@rtinMedlem sedan dec. 19991 214 inlägg
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 ;)
@ndersMedlem sedan juni 200026 914 inlägg
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. :)
Erik JuhlinMedlem sedan maj 20007 625 inlägg
Du kan ju skriva ungefär så här:
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.
M@rtinMedlem sedan dec. 19991 214 inlägg
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;