2009-08-18 8 views
10

I Rang: MySQL, erhalten eine MySQL-Tabelle hat wie unten Benutzer

id  name  points 
1  john  4635 
3  tom  7364 
4  bob  234 
6  harry 9857 

Ich mag im Grunde erhalte einen einzelnen Benutzer Rang

ohne alle Benutzer auswählen. Ich möchte nur einen einzelnen Benutzer nach ID auswählen und den Rang des Benutzers abrufen, der durch die Anzahl der Punkte bestimmt wird, die sie haben.

Zum Beispiel wieder tom mit dem Rang 2 Auswahl durch die ID 3.

Prost

Eef

Antwort

18
SELECT uo.*, 
     (
     SELECT COUNT(*) 
     FROM users ui 
     WHERE (ui.points, ui.id) >= (uo.points, uo.id) 
     ) AS rank 
FROM users uo 
WHERE id = @id 

Dense Rang:

SELECT uo.*, 
     (
     SELECT COUNT(DISTINCT ui.points) 
     FROM users ui 
     WHERE ui.points >= uo.points 
     ) AS rank 
FROM users uo 
WHERE id = @id 
+0

Prost paaren, funktioniert perfekt – RailsSon

+0

ich es lieben. Ein bisschen Tuning und es passt zu meinen Bedürfnissen. Tnx zum Teilen! –

+0

Kleinere Ausgabe: Wenn es Gleichstände gibt, gibt dies den höchsten und nicht den niedrigsten Rang zurück. Wenn Sie die niedrigste Einstellung wünschen, ändern Sie die Bedingung in '>' und den Wert in 'COUNT (*) + 1'. – Barmar

2

Lösung von @ Quassnoi wird im Falle von Bindungen scheitern. Hier ist die Lösung, die bei Verbindungen funktionieren:

SELECT *, 
IF (@score=ui.points, @rank:[email protected], @rank:[email protected]+1) rank, 
@score:=ui.points score 
FROM users ui, 
(SELECT @score:=0, @rank:=0) r 
ORDER BY points DESC 
+0

Zu beachten, der Rang wird 0 sein, wenn der erste Platz eine Punktzahl von 0 hat. Zusätzlich, im Falle von Bindungen, wird der Rang inkrementiert, nicht übersprungen, z.B. 10 - 1., 9 - 2., 9 - 2., 6 - 3.. Außerdem sollte das Abrufen von Zeilen in einer Unterabfrage erfolgen, da die Reihenfolge nach dem Ranking angewendet wird. – Sean

0
SET @rownum := 0; 
SELECT rank, score FROM (SELECT @rownum := @rownum +1 AS rank, `score` ,`user_id` 
FROM leaderboard 
ORDER BY `score` DESC , `updated_timestamp`) as result WHERE `user_id`=$user_id 
LIMIT 1