【发布时间】:2020-05-29 19:42:50
【问题描述】:
我试图更好地理解 MySQL 的工作原理。我遇到了子组的问题。从问题Unknown column in 'having clause',我明白了为什么这段代码会返回错误:
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 的新手。
【问题讨论】:
-
COUNT() 无法访问,它使语法落后于逻辑。 w.Author_id=1 和 count(w.Author_id)= 1 这两个条件完全不同。如果要添加条件 w.Author_id=1 则可以在 where 子句中使用。在拥有子句中,您应该使用分组字段或聚合函数。