Php 使用MYSQL对SQL表进行排名,按分数排序,其中game=x

Php 使用MYSQL对SQL表进行排名,按分数排序,其中game=x,php,mysql,sql,Php,Mysql,Sql,我正在尝试构建一个非常简单的在线功能系统。该系统必须处理的一个查询是返回记分板(所有球员的得分、排序和排名)。我知道基本的sql查询,但当涉及子查询和查询中的变量等时,我完全不知所措 该表只有三列。游戏,用户id,分数。该表将允许人们上传和下载任何游戏的分数。我需要弄清楚如何创建一个查询,只返回被查询游戏的用户,按分数排序玩家,然后对他们进行排名,这样重复的分数将具有相同的排名。下面是期望结果的一个简单示例: 桌子 期望输出 user score rank fred

我正在尝试构建一个非常简单的在线功能系统。该系统必须处理的一个查询是返回记分板(所有球员的得分、排序和排名)。我知道基本的sql查询,但当涉及子查询和查询中的变量等时,我完全不知所措

该表只有三列。游戏,用户id,分数。该表将允许人们上传和下载任何游戏的分数。我需要弄清楚如何创建一个查询,只返回被查询游戏的用户,按分数排序玩家,然后对他们进行排名,这样重复的分数将具有相同的排名。下面是期望结果的一个简单示例:

桌子

期望输出

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
但排名似乎考虑了其他游戏,这破坏了排名。我发现的其他查询排名正确,但没有排除其他游戏(同样,在排名时考虑其他游戏的分数)

同样,上面是我调整过的一个例子,因为我不知道如何使用@variables、子查询等

非常感谢,


要为相同的分数显示相同的等级,您可以使用case和其他变量来检查相同的等级

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'
根据评论编辑


只需简单地按语句排序即可。“按分数排序,排名”。这将返回按分数排序的集合,然后再按等级排序。因此,如果分数相等,则将按等级排序。依此类推。一个用户可以在一场游戏中拥有多个分数吗?但没有现有的等级列-我所看到的示例似乎在对数组排序时创建了某种形式的等级变量。其中一个示例将等级保留为e与匹配分数相同,如我在上面的示例中所示,但他们不允许我在任何地方添加WHERE game=x而不中断查询。对不起,@barrel,是的,就是这个主意。每场比赛的分数有多少。表名在哪里?发现表中有“t”。请突出显示此:)@DanielPrice我已经更新了我的答案将你的表名放入查询中当你查找表名时,如果有游戏的分数高于你的游戏最高分数,此修复程序仍然无法工作。是的!太棒了,谢谢你!我几乎要改成一个简单的sql查询,然后用PHP完成其余的工作。令人惊叹的。非常感谢你!
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'