MySQL,获取用户排名
我有一个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.*, (
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