在SQL中计算排名

时间:2014-02-26 00:02:36

标签: mysql sql rank

我已经搜索过我的问题,但找不到任何可以解决问题的方法。

我想展示一款游戏的前十名个人记录。每个车都有一个能在某条轨道上获得积分的玩家。

数据库表:

player = id, playername, username 
score = id, track, car, bestscore, totalscore, player_id (foreign key to player.id)

我要做的是显示每首曲目的前10个分数(因此该曲目中最好的汽车得分最高)。它应该看起来像totalscore,track,car,rank。

在我的查询中,我应该可以为每个用户名制作一个这样的概述,所以我也必须加入表格。

到目前为止,我正在尝试这个:

SELECT    player_id, totalscore, track, car,
          @curRank := @curRank + 1 AS rank
FROM      score s, (SELECT @curRank := 0) r
WHERE player_id = 1
ORDER BY  totalscore DESC
LIMIT 10

这只是为了显示玩家1的最高分,但这当然应该是“当前用户名='名字'。我现在真的很困难。等级似乎不能正常工作。它应该显示他说的每条记录上的用户等级。

示例:

Track - car - totalscore (Best) - rank    
track1 - car1 - 30 - 2 (one user has a higher score on track1)    
track2 - car2 - 20 - 5 (four users have a higher score on track2)    
track3 - car1 - 10 - 1 (this user has the highest score on track3)

我真的不知道如何解决这个问题。我希望我的解释是可以理解的!

提前致谢

编辑:

SELECT  uo.track, uo.car, uo.totalscore, p.username, 
(SELECT COUNT(DISTINCT ui.totalscore)
FROM score ui WHERE ui.totalscore>= uo.totalscore
AND ui.track = uo.track) AS rank
FROM score uo
JOIN player p 
ON p.id = uo.player_id
WHERE p.username = 'Bose321'
GROUP BY uo.totalscore
ORDER BY totalscore DESC

我一直在尝试使用其他代码,这似乎接近我想要的。唯一的问题是它显示了一条赛道上所有赛车的所有得分。我只想获得该赛道上的最高分,并展示所使用的赛车。

1 个答案:

答案 0 :(得分:3)

您似乎想要使用变量执行此操作,并且您希望按轨道排名。所以,你很接近,但你需要跟踪track

SELECT    player_id, totalscore, track, car,
          @curRank := if(@track = track, @curRank + 1, 1) AS rank,
          @track = track
FROM      score s cross join
          (SELECT @curRank := 0, @track := '') r
ORDER BY  track, totalscore DESC;

如果您想要一个子集(例如得分最高的子集),那么您可以将此查询用作子查询。

没有变量的替代方法是使用相关子查询:

SELECT player_id, totalscore, track, car,
       (select 1 + count(*)
        from score s2
        where s2.track = s.track and
              s2.totalscore > s.totalscore
       ) as rank
FROM  score s
WHERE player_id = 1
ORDER BY  totalscore DESC;

这与处理变量的版本略有不同。具有相同分数的玩家将具有相同的等级。

此版本将使用score(track, totalscore)上的索引。