MySQL, obtenir le rang des utilisateurs

j'ai une table mysql comme ci-dessous:

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

je veux fondamentalement obtenir un rang d'utilisateur individuel sans sélectionner tous les utilisateurs. Je ne veux sélectionner un seul utilisateur par id et obtenir les utilisateurs, au rang qui est déterminé par le nombre de points qu'ils ont.

par exemple, revenir tom avec le rang 2 en sélectionnant par l'id 3.

Cheers

Eef

10
demandé sur RailsSon 2009-08-18 17:26:14

3 réponses

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

rang Dense:

SELECT  uo.*, 
        (
        SELECT  COUNT(DISTINCT ui.points)
        FROM    users ui
        WHERE   ui.points >= uo.points
        ) AS rank
FROM    users uo
WHERE   id = @id
18
répondu Quassnoi 2014-02-11 15:30:26

Solution par @Quassnoi va échouer en cas de liens. Voici la solution en cas de liens:

SELECT *,
IF (@score=ui.points, @rank:=@rank, @rank:=@rank+1) rank,
@score:=ui.points score
FROM users ui,
(SELECT @score:=0, @rank:=0) r
ORDER BY points DESC
2
répondu Arvind Bhardwaj 2013-05-03 11:07:55
 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
0
répondu Saurabh Chandra Patel 2013-06-18 07:15:20