我已经搜索过我的问题,但找不到任何可以解决问题的方法。
我想展示一款游戏的前十名个人记录。每个车都有一个能在某条轨道上获得积分的玩家。
数据库表:
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
我一直在尝试使用其他代码,这似乎接近我想要的。唯一的问题是它显示了一条赛道上所有赛车的所有得分。我只想获得该赛道上的最高分,并展示所使用的赛车。
答案 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)
上的索引。