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

Mysql 为什么ORDER BY+MAX()在我分组时返回最大值?,mysql,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.da

我有一个问题的这一部分:

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
工作正常,但我真的不明白为什么它会工作:Order by用于整行,而不是分组…

当您说SELECT trackid时,MAXhistory.date。。。按trackid分组按MAXhistory.date DESC排序您的意思是:为每个轨迹列表显示最新的历史记录条目,并请首先向我显示轨迹列表,其中最新的历史记录条目是最新的

ORDER BY应用于分组之后,这就是为什么在SQL中它位于GROUP BY之后

请注意,在您的示例中,您选择了tracklist.value、history.date,而不是选择tracklist.value、MAXhistory.date。这是错误的,不幸的是MySQL没有给出警告,但它自行选择了一个随机的history.date。

按MAXhistory排序。如果您只想对结果集排序,则date DESC有些多余。排序适用于结果集


如果删除ORDERBY子句,请考虑结果。否则,查询将只在trackid列上分组,因此它将无效。您需要向date列添加聚合函数或向groupby子句添加date列。通过将聚合函数添加到ORDERBY子句,您实际上是在告诉SQL引擎,对于每组trackid,获取最长日期。这似乎是您想要的。

您似乎没有完全理解GROUP BY语句。我建议你查一本关于它的教程


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

是的,但我看到,在我的代码中,它返回带有最大日期的trackid,但在分组时……这很奇怪。。。不是吗?我不明白。请张贴您正在选择的字段、您获得的数据和您期望的数据。因此,您的代码可以正常工作,您想知道为什么以及如何工作?更新了我的答案,希望有更好的解释。是的,你说对了:排序依据是在分组之后应用的;但在订购之前,我需要获得每个组的行,其中包含MAX date…为什么要使用order BY MAX来完成此操作?这是我真的不明白…如果你按一个你没有选择的字段排序,它会隐式地添加到选择字段中,所以你会遇到与随机值相同的问题。在这种情况下,您可以通过设置SET SESSION sql\u mode=concatoly\u FULL\u GROUP\u by、、@@sql\u mode来指示MySQL警告您。不幸的是,这种模式的实现有缺陷,所以您不能一直使用它。