[英]Why can HAVING reference COUNT(column_name) but not the column_name itself?
我試圖更好地了解 MySQL 的工作原理。 我遇到了子組的問題。 從“有子句”中的問題未知列中,我理解了為什么這段代碼會返回錯誤:
SELECT b.Title, b.Isbn
FROM Book AS b
INNER JOIN Writing AS w ON w.Book_id = b.ID
GROUP BY b.ID
HAVING w.Author_id = 1 AND b.Title LIKE "%Head%"
該錯誤是:“‘有子句’中的未知列‘w.Author_id’”,因為:
SQL 標准要求 HAVING 必須僅引用 GROUP BY 子句中的列或聚合函數中使用的列。 但是,MySQL 支持此行為的擴展,並允許 HAVING 引用 SELECT 列表中的列和外部子查詢中的列。
但是,如果我使用COUNT(w.Author_id) > 1
而不是w.Author_id = 1
,則代碼執行並正常工作:
SELECT b.Title, b.Isbn
FROM Book AS b
INNER JOIN Writing AS w ON w.Book_id = b.ID
GROUP BY b.ID
HAVING COUNT(w.Author_id) > 1 AND b.Title LIKE "%Head%"
所以,我的問題是: COUNT()
是什么讓w.Author_id
可以訪問? 如果這是一個愚蠢/明顯的問題,我深表歉意——我還是 SQL 的新手。
關於這個主題的文檔似乎很清楚。 但是讓我看看我是否可以為你更好地解釋它。
HAVING
子句本質上是在GROUP BY
之后“發生”的WHERE
子句。 也就是說,聚合已經發生,所以可用的數據就是聚合數據。
在您的示例中,聚合沒有返回Author_Id
。 而 MySQL 不知道如何生成一個。
但是, COUNT(w.Author_Id)
是聚合結果。 MySQL 可以(從概念上)將其添加到聚合返回的結果中並對其進行過濾。
您的查詢相當於:
SELECT Title, Isbn
FROM (SELECT b.Title, b.Isbn, COUNT(*) as cnt
FROM Book b JOIN
Writing w
ON w.Book_id = b.ID
GROUP BY b.ID
) b
WHERE cnt > 1 AND b.Title LIKE '%Head%';
也就是說,查詢最好寫成:
SELECT b.Title, b.Isbn
FROM Book b JOIN
Writing w
ON w.Book_id = b.ID
WHERE b.Title LIKE '%Head%'
GROUP BY b.ID
HAVING COUNT(*) > 1;
您可以在聚合之前過濾title
,這通常效率更高。
當您將w.Author_id
放入表達式COUNT(w.Author_id) > 1
時,您就滿足了 HAVING 子句的要求
HAVING 必須僅引用 GROUP BY 子句中的列或聚合函數中使用的列
而單獨的 ID 列不會,因為它不是GROUP BY
子句的一部分,也不在聚合 function (其中COUNT
是)內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.