使用MYSQL对SQL表进行排名,按分数排名,WHERE game = x

时间:2014-06-04 19:15:13

标签: php mysql sql

我正在尝试构建一个非常简单的在线功能系统。该系统必须处理的一个查询是返回记分牌(所有玩家得分,排序和排名)。我知道基本的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

但排名似乎考虑到其他游戏,这会破坏排名。我发现的其他查询排名正确,但未排除其他游戏(再次,在排名时考虑其他游戏分数。

同样,以上是我调整的一个例子,因为我不知道如何使用@变量,子查询等。

非常感谢,

  • 丹。

1 个答案:

答案 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'

Demo

根据评论进行修改

Updated Demo