2016-03-17 23 views
0

怎麼回事,像這樣的查詢在MySQL工作(在5.6現在):MySQL的順序由後分組工作意外

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

你是正確的混淆。 MySQL允許這種行爲 - 不僅在order by中,也在havingselect子句中。

基本上,MySQL使用不確定的匹配行的值。一般來說,這是語言中的(錯誤)特徵,並導致無意的錯誤 - 在大多數情況下。

當組內所有行的值爲node.lft時,這是合理的。在這種情況下,儘管使用諸如MIN(node.lft)之類的東西會導致很少的額外開銷。

有關此問題的一些注意事項:

  • MySQL的documentation - 通過5.6版 - 特別警告有關此功能。
  • ANSI支持非常類似的功能。基本上,如果被引用的列在功能上依賴於(即,唯一確定的)group by中的列,則允許列沒有聚合功能。
  • 版本5.7中的MySQL文檔會丟失對該功能的完整說明,可能是因爲數據庫正在朝這個區域的ANSI標準發展。
+0

優秀的答案!非常感謝。 – Alex