我有一部分查询:
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
工作正常,但我真的不明白它为什么会起作用:)顺序是整行,而不是分组......
答案 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也必须包含聚合函数的原因。