我正在尝试构建一个非常简单的在线功能系统。该系统必须处理的一个查询是返回记分牌(所有玩家得分,排序和排名)。我知道基本的SQL查询,但是当涉及查询等中的子查询和变量时,我完全迷失了。
该表只有三列。游戏,user_id,得分。该表将允许人们上传和下载任何游戏的分数。我需要弄清楚如何创建一个查询,该查询只返回被查询游戏中的用户,按分数对玩家进行排序,然后对它们进行排名,以便重复的分数具有相同的等级。以下是预期结果的简要示例:
表
user game score
fred A 100
bill A 78
john A 78
dave B 71
terry B 60
jean B 60
tom A 60
nick A 57
期望的输出
user score rank
fred 100 1
bill 78 2
john 78 2
tom 60 4
nick 57 5
当前输出**参与计算它应该忽视的游戏
user score rank
fred 100 1
bill 78 2
john 78 2
tom 60 5
nick 57 8
这是目前最有效的查询:
SELECT @rank:=@rank+1 AS ranking, user_id, score
FROM score_table , (SELECT @rank:=1) AS i
WHERE game='A'
ORDER BY score DESC
但排名似乎考虑到其他游戏,这会破坏排名。我发现的其他查询排名正确,但未排除其他游戏(再次,在排名时考虑其他游戏分数。
同样,以上是我调整的一个例子,因为我不知道如何使用@变量,子查询等。
非常感谢,
答案 0 :(得分:2)
要显示相同分数的相同排名,您可以使用案例和其他变量来检查相同的分数
SELECT ranking,user,score FROM
(SELECT
@rank:=case when score =@s then @rank else @rank+1 end AS ranking,
@s:=score,
user, score,game
FROM tablename , (SELECT @rank:=0,@s:=0) AS i
ORDER BY score DESC
) new_alias
WHERE game='A'
根据评论进行修改