分组后的MySQL顺序意外地工作

时间:2016-03-17 01:13:13

标签: mysql group-by

这样的查询在MySQL中是如何工作的(现在是5.6):

SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

我很困惑,我习惯了SQL Server,在那里它会抱怨node.lft不在所选列的列表中,但在MySQL中它很有用,

感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

你很困惑。 MySQL允许这种行为 - 不仅在order by中,而且在havingselect子句中也是如此。

基本上,MySQL使用来自 indeterminate 匹配行的值。一般来说,这是语言中的(错误)功能,并导致无意的错误 - 在大多数情况下。

node.lft的值在组中的所有行上相同时,这是合理的。但是,在这种情况下,使用像MIN(node.lft)之类的东西会产生很少的额外开销。

关于此行为的一些注意事项:

  • MySQL documentation - 通过5.6版 - 特别警告此功能。
  • ANSI支持非常相似的功能。基本上,如果被引用的列在功能上依赖于({唯一确定] group by中的列,则允许列没有聚合函数。
  • 5.7版本中的MySQL文档删除了该功能的完整说明,可能是因为数据库正朝着该领域的ANSI标准发展。