簡體   English   中英

為什么 HAVING 可以引用 COUNT(column_name) 而不能引用 column_name 本身?

[英]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.

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