使用连接显示MAX值

时间:2014-02-20 22:49:45

标签: mysql sql join max

我正在努力建立一个查询。对于一场比赛,我想要显示前十名的分数。

我的表格如下:

player = id,playername,username 得分= id,track,car,bestscore,totalscore,player_id(player.id的外键)

对于top10,我想显示球员名称,总得分,赛车和赛道。

我当前的查询是:

SELECT p.playername, MAX(s.totalscore) totalscore, s.car, s.track
FROM player p
INNER JOIN score s on p.id = s.player_id
GROUP BY p.playername
ORDER BY MAX(s.totalscore) DESC
LIMIT 10

除了一个问题外,这似乎工作正常。如果用户在赛道1上的得分为50且有车1,然后在赛道1上用车2得分为60,我会在查询中看到车1。如果这个用户,它似乎没有得到最高分的相应车。

我希望我说的是有道理的。

提前致谢!

编辑:

SELECT p.playername, MAX(s.totalscore) as totalscore, s.car, s.track
FROM (SELECT * FROM score ORDER BY totalscore DESC) s
INNER JOIN player p ON s.player_id = p.id 
GROUP BY p.playername
ORDER BY MAX(s.totalscore) DESC
LIMIT 10

此查询似乎可以解决问题。我一直在努力,结果集就是我的意思。这有什么好处的吗?我不擅长SQL,只是因为它的作用并不总是意味着它很好,是吗?

2 个答案:

答案 0 :(得分:0)

当您将非聚合字段作为聚合查询的一部分而不在您的组中时,并且与您所分组的关系具有多对一关系时,MySQL不保证它将返回什么。

此查询会在另一个RDBMS中引发错误。如果您关心(人,车)元组的最高分,只需将其添加到组中即可。但是,如果您希望每个玩家获得最高分,无论使用什么车,您都需要子查询或自我加入。

一种方法:

SELECT p.playername, s1.totalscore , s1.car, s1.track
FROM player p
INNER JOIN 
score s1 on p.id = s1.player_id
WHERE s1.totalscore = ( SELECT MAX(totalscore) FROM score s2 WHERE s2.player_id=s1.player_id)
ORDER BY s1.totalscore DESC
LIMIT 10

答案 1 :(得分:0)

您在playername上使用“Group By”,因此其他列将以“mysql desides”方式进行分组。如果你想获得你应该添加的汽车 - 开车分组。

SELECT p.playername, MAX(s.totalscore) totalscore, s.car, s.track
FROM player p
INNER JOIN score s on p.id = s.player_id
GROUP BY p.playername, s.car //added car 
ORDER BY s.totalscore DESC
LIMIT 10