簡體   English   中英

SELECT列表中沒有選擇的GROUP BY列名

[英]GROUP BY column name without selecting it in the SELECT list

SELECT person
FROM person
INNER JOIN collectionmember ON sourceobjectid = personid
GROUP BY sourceobjectid 
HAVING COUNT(sourceobjectid) > 1;

據說如果我們使用GROUP BY子句, GROUP BY列名必須在SELECT column列表中。 但是上面的查詢在沒有選擇sourceobjectid的情況下工作。

這個查詢是如何工作的?

結果不是遇到第一行。 MySQL 對所謂的“隱藏列”的使用非常清楚。 引用文檔

MySQL 擴展了 GROUP BY 的使用,因此 select 列表可以引用 GROUP BY 子句中未命名的非聚合列。 這意味着前面的查詢在 MySQL 中是合法的。您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。 但是,這主要適用於未在 GROUP BY 中命名的每個非聚合列中的所有值對於每個組都相同的情況。 服務器可以自由地從每個組中選擇任何值,因此除非它們相同,否則所選的值是不確定的。 此外,添加 ORDER BY 子句不會影響從每個組中選擇值。 結果集的排序發生在選擇值之后,並且 ORDER BY 不影響服務器選擇每個組中的哪些值。

此擴展的目的是允許您在表的主鍵上進行分組的查詢,而不必放入所有其他列。 這種行為實際上是符合 ANSI 標准的。

在其他情況下使用“隱藏列”是值得懷疑的。 選擇的值是任意的。 MySQL 甚至不能保證它們來自同一行(盡管實際上它們確實如此)。

對於 MySQL 數據庫,此行為是預期的。 它允許將任何列放在 select 子句中。 您的示例的結果將是每個組的第一個*。

*什么是第一排取決於很多事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM