我有一个 Books 表,我在其中存储书籍数据(ISBN、书名、作者等)。为了区分哪些书是彼此的版本,我有一个字段 Edition_Group_ISBN,它是组中的任意 ISBN。
我在执行此查询时遇到了问题,该查询本应根据 ISBN 提供图书数据和其他版本的数量:
SELECT *, Editions_Count
FROM Books
LEFT JOIN ((SELECT Edition_Group_ISBN, COUNT(*) AS Editions_Count
FROM Books
WHERE Edition_Group_ISBN IN (SELECT Edition_Group_ISBN
FROM Books)
GROUP BY Edition_Group_ISBN) AS b
) ON (Books.Edition_Group_ISBN = b.Edition_Group_ISBN
AND Books.Edition_Group_ISBN != NULL)
WHERE ISBN = 9780140447897
查询给出了 9780140447897 的图书数据,但它给出的 Editions_Count 为 NULL,表明 LEFT JOIN 无效。
最佳答案
试试这个更简单的查询:
SELECT b.*, COUNT(*) AS Editions_count
FROM Books b JOIN Books g USING (Edition_Group_ISBN)
WHERE b.ISBN = 9780140447897
GROUP BY b.book_id;
我认为您使问题变得比您需要的要难得多。您的原始查询充满了令人困惑的子查询,至少其中一个是完全多余的。
回复你的评论:
是的,以这种方式将 ISBN 与多个值进行比较效果很好:
SELECT b.*, COUNT(*) AS Editions_count
FROM Books b JOIN Books g USING (Edition_Group_ISBN)
WHERE b.ISBN IN (9780140447897, 9781934356555)
GROUP BY b.book_id;
COUNT(*)
仅支持普通通配符 *
,这意味着对组中的所有行进行计数。
或者您可以使用像 COUNT(g.Edition_Group_ISBN)
这样的特定表达式,这意味着计算组中该表达式为非空的所有行。
但是你不能使用 g.*
因为它有歧义。它计算组中的所有行吗? (如果是这样,只需使用 COUNT(*)
)它是否计算组中的非空行?这到底意味着什么——计算 g
中 所有 列非空的行数,或者 g< 中的任何 列的行数
是非空的?由于这些原因,COUNT(g.*)
根本不是 SQL 语言中的合法构造。
关于mysql - 左连接不工作(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339849/