为什么ORDER BY + MAX()在分组时会返回最大值?

时间:2011-04-28 15:03:33

标签: mysql

我有一部分查询:

GROUP BY trackid 
ORDER BY MAX(history.date) DESC

我看到,当我进行分组时,它会返回每个组的最大日期行。为什么会这样?订单应该适用于整行...而不是分组?!?!?

编辑(示例)

这是我的全部问题:

SELECT tracklist.value, history.date
FROM history JOIN tracklist ON history.trackid=tracklist.trackid 
ORDER BY history.date DESC

结果是:

tracklist3  2011-04-27 15:40:36
tracklist2  2011-04-27 13:15:43
tracklist2  2011-04-02 00:30:02
tracklist2  2011-04-01 14:20:12
tracklist1  2011-03-02 14:13:58
tracklist1  2011-03-01 12:11:50

如您所见,history.date正确排序了所有行。 现在我想对它们进行分组,为每个组保留MAX history.date的行。 所以输出应该是:

tracklist3  2011-04-27 15:40:36
tracklist2  2011-04-27 13:15:43
tracklist1  2011-03-02 14:13:58

我明白了:

GROUP BY trackid 
ORDER BY MAX(history.date) DESC

工作正常,但我真的不明白它为什么会起作用:)顺序是整行,而不是分组......

3 个答案:

答案 0 :(得分:5)

当你说SELECT trackid, MAX(history.date) ... GROUP BY trackid ORDER BY MAX(history.date) DESC时,你真的在​​说:“让我看看每个跟踪列表中最新的历史记录条目,并请向我显示最近历史记录条目(最新的)最近的跟踪列表。”

{<1}}在分组后应用(这就是为什么它出现在SQL中的ORDER BY之后。)

请注意,在您的示例中,您有GROUP BY而不是SELECT tracklist.value, history.date。这是错误的,不幸的是MySQL没有发出警告,但它自行决定选择随机 SELECT tracklist.value, MAX(history.date)

答案 1 :(得分:4)

如果你想要做的就是订购结果集,那么

ORDER BY MAX(history.date) DESC有点多余。订购适用于结果集

如果删除ORDER BY子句,请考虑结果。如果没有这个,您的查询将只在trackid列上进行分组,因此它无效 - 您需要将聚合函数添加到日期列或将日期列添加到GROUP BY子句。通过将聚合函数添加到ORDER BY子句,您实际上是告诉SQL引擎,对于每个trackid组,获取最大日期。这似乎是你想要的。

答案 2 :(得分:2)

您似乎并不完全理解GROUP BY语句。我建议你查一下教程。

但实质上,GROUP BY语句将多个行合并为一个。 GROUP BY的列名称确定新组合行的唯一性。 SQL不知道如何处理所有未分组的列,因为每个新的组合行将从这些列中包含不同值的多个行中提取数据。这就是您在SELECT语句中的非分组列上使用聚合函数的原因。聚合函数MAX()查看history.date列中要合并的行的所有值,并仅返回其中一个。此外,ORDER BY子句只能使用正在选择的列,这就是ORDER BY也必须包含聚合函数的原因。