左连接不起作用(MySQL)

bgc*_*ode 1 mysql join left-join

我有一个表书籍,我存储书籍数据(ISBN,标题,作者等).为了说明哪些书是彼此的版本,我有一个字段Edition_Group_ISBN,这是该组中的任意ISBN.

我无法获得此查询,该查询应该为Book数据和基于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
Run Code Online (Sandbox Code Playgroud)

该查询给出了9780140447897的书籍数据,但它给出了Editions_Count AS NULL,表明LEFT JOIN不起作用.

Bil*_*win 5

尝试这个更简单的查询:

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;
Run Code Online (Sandbox Code Playgroud)

我认为你提出的问题比你需要的要困难得多.您的原始查询充满了令人困惑的子查询,其中至少有一个完全是多余的.


你的意见:

是的,它可以通过这种方式将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;
Run Code Online (Sandbox Code Playgroud)

COUNT(*)仅支持普通通配符*,这意味着计算组中的所有行.

或者您可以使用特定的表达式COUNT(g.Edition_Group_ISBN),这意味着计算该表达式为非null的组中的所有行.

但你不能使用,g.*因为它含糊不清.它是否计算组中的所有行?(如果是这样,只需使用COUNT(*))它是否计算组中的非空行?无论如何,这意味着什么 - 计算所有g都是非空的行,或者任何列来自g非空的行?由于这些原因,COUNT(g.*)根本不是SQL语言中的法律构造.