MySQL,获取用户排名

MySQL,获取用户排名,sql,mysql,rank,Sql,Mysql,Rank,我有一个mysql表,如下所示: id name points 1 john 4635 3 tom 7364 4 bob 234 6 harry 9857 我基本上希望获得一个单独的用户排名,而不选择所有的用户。我只想选择一个单一的用户id和获得的用户排名,这是由他们的点数决定 例如,使用id 3选择的秩2返回tom 干杯 Eef 密集等级: SELECT uo.*, (

我有一个mysql表,如下所示:

id     name     points
1      john     4635
3      tom      7364
4      bob      234
6      harry    9857
我基本上希望获得一个单独的用户排名,而不选择所有的用户。我只想选择一个单一的用户id和获得的用户排名,这是由他们的点数决定

例如,使用id 3选择的秩2返回tom

干杯

Eef

密集等级:

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

如果出现联系,@Quassnoi的解决方案将失败。以下是适用于领带的解决方案:

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

@Barmar:如果有联系,这将使用
id
作为次要标准。@Barmar:要模拟
densite\u RANK
(这就是你所说的)只需将
COUNT(*)替换为
COUNT(不同点)
,也将合并你前面的联系。如果分数是10、9、9、8、8,那么排名应该是1、2、2、4、4(或者更具体地说,是1、2-3、2-3、4-5、4-5)。@Barmar:有三个用于排名的窗口函数:
行数
(我的原始查询)、
排名
(你以前的评论)和
密集排名
(我以前的评论)。由于它们都存在并被使用,在不知道OP的确切意图的情况下,我不会使用“应该”。我认为游戏中排名的报告方式通常就是我描述的方式。他们会报道类似“并列第四和第五名”的报道。如果排名第一的选手平局,他们之后的选手将获得第三名,而不是第二名。请注意,如果排名第一的选手得分为0,排名将为0。此外,如果出现平局,排名将增加,而不是跳过,例如10-1、9-2、9-2、6-3。此外,行的获取应该在子查询中,因为顺序是在排名之后应用的。
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
 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