2013-05-13 138 views
1

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

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

听起来很像这是最近回答http://stackoverflow.com/questions/16531573/select-the-database-getting-all-the-maximum-values-of-a-column/16531740#16531596 – gillyspy 2013-05-13 21:55:35

+0

什么'日期','scoreid','playerid'你想要在'max(score)'中有什么联系时返回?每一行都是?武断?所有可能性都合并为一行? – gillyspy 2013-05-13 21:59:31

+0

是一群真正由'group by gameid'代表的游戏吗?单凭名称'gameid'听起来像是一个独特的游戏,但也可以代表一组游戏,但是我不能说明没有澄清 – gillyspy 2013-05-13 22:01:30

回答

1

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

如果你想返回有你应该使用这样的查询最大比分的所有行:

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

,或者如果你想回到那个有每个游戏ID的最大比分的行,像此:

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

请参阅小提琴here

+0

你给我提供的第二个代码是小窍门。谢谢! – Casey 2013-05-13 22:40:09

3

MAX(分数)不会得到具有最高分数的那一行。它将简单地返回最高分,但所有其他字段可以简单地属于另一行。

你可以更好的尝试:

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

为什么要返回其他字段('date'等),然后@ nl-x? – gillyspy 2013-05-13 22:03:11

+0

@gillyspy我不明白你的问题。 OP在他试图获得与max(分数)相关的其他字段的地方有查询。我不知道他为什么想要拥有这些领域。 – 2013-05-13 22:05:04

+0

这可能会完全排除/跳过整个gameid(除非足球比分是1-0;))。我怀疑这是什么运作需要。是的,我们需要更清晰。 – gillyspy 2013-05-13 22:06:40