【问题标题】:Calculate rank in SQL在 SQL 中计算排名
【发布时间】:2014-03-28 13:06:06
【问题描述】:

我已经搜索了我的问题,但找不到任何真正为我解决问题的东西。

我想显示游戏的前 10 名个人记录。每辆车都有一个玩家在特定赛道上得分。

数据库表:

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

我要做的是显示每条赛道的前 10 名得分(因此该赛道的最佳赛车得分最高)。它应该看起来像总分、赛道、赛车、排名。

在我的查询中,我应该能够对每个用户名进行这样的概述,因此我还必须加入表格。

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

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 的最高分数,但这应该是“当然,其中 username = 'name'。我现在真的被这个卡住了。排名似乎无法正常工作。它应该显示用户在他所说的每条记录上的排名。

例子:

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

我一直在尝试使用另一个代码,这似乎接近我想要的。唯一的问题是它显示了一条赛道上所有汽车的所有分数。我只想要那条赛道上的最高分,并展示使用过的汽车。

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集

标签: mysql sql rank


【解决方案1】:

您似乎想使用变量来执行此操作,并且您希望按轨道进行排名。所以,你很接近,但你还需要跟踪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) 上的索引。

【讨论】:

  • 这只会在所有地方返回排名 1。
  • @Bose321。 . .对于第一个版本,您需要删除where 子句并拥有正确的order by。您可以通过将其设为子查询来进行额外的过滤。最后一个版本允许您根据需要进行过滤和排序。
  • 我刚刚尝试了您的第二种方法,但在 PHPMyAdmin 中出现错误:#1054 - Unknown column 's2.score' in 'where Clause'
猜你喜欢
  • 2015-04-15
  • 2011-06-18
  • 2013-04-03
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多