我有一个类似下面的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(*)
FROM users ui
WHERE (ui.points, ui.id) >= (uo.points, uo.id)
) AS rank
FROM users uo
WHERE id = @id
密集排名:
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
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
DENSE_RANK
(这就是你所谈论的),只需将COUNT(*)
替换为COUNT(DISTINCT points)
即可。 - QuassnoiROW_NUMBER
(我的原始查询),RANK
(你之前的评论)和DENSE_RANK
(我的之前的评论)。由于它们都存在并被使用,我不会在不知道OP的确切意图的情况下使用“应该”。 - Quassnoi