MySQL查询意外结果

时间:2013-05-13 21:54:01

标签: php mysql database

我正在尝试运行MySQL查询以返回有关一组游戏的最高分的一些信息。该表格设置为包含以下列:scoreid,score,gameid,playerid,date。当我运行以下SQL命令时,它给了我适当的高分,但返回第一个提交的playerid和日期。我在这里做错了什么?

SELECT date, MAX(score) as score, scoreid, playerid FROM scores GROUP BY gameid

2 个答案:

答案 0 :(得分:3)

MAX(得分)不会获得具有最高分数的行。它只会返回最大分数,但所有其他字段只能属于另一行。

你可以更好地尝试:

SELECT date, score, scoreid, playerid FROM scores GROUP BY gameid HAVING score = MAX(score)

答案 1 :(得分:1)

您正在按gameid进行分组,但是您要返回一些非聚合列(datescoreidplayerid)。 MySQL允许您通过查询选择组中的非聚合列,但这些列的值将不确定(它通常会返回第一个遇到的值,但这没有记录,您不能依赖它) 。 Score已聚合(您正在使用MAX()这是一个聚合函数),因此其值将是正确的。

如果要返回所有具有最高分数的行,则应使用如下查询:

SELECT date, score, scoreid, playerid
FROM   scores
WHERE  score = (SELECT MAX(score) FROM scores)

或者如果你想返回每个gameid具有最高分数的行,可以这样:

SELECT date, score, scoreid, playerid
FROM   scores
WHERE  (gameid, score) IN (SELECT gameid, MAX(score) FROM scores GROUP BY gameid)

请参阅小提琴here