左连接不起作用(MySQL)

时间:2010-07-27 00:04:16

标签: mysql join left-join

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

我无法获取此查询,该查询应该根据ISBN提供Book数据和其他版本的数量:

   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 AS NULL,表明LEFT JOIN不起作用。

2 个答案:

答案 0 :(得分: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;

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


重新评论:

是的,可以通过这种方式将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)之类的特定表达式,这意味着计算该表达式为非null的组中的所有行。

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

答案 1 :(得分:1)

查询似乎包含了许多重言式 - 这些陈述总是正确的。

我认为你可以将其简化为

 SELECT books.*, b.Editions_Count 
     FROM Books 
LEFT JOIN ((SELECT Edition_Group_ISBN, COUNT(*) AS Editions_Count 
              FROM Books 
              GROUP BY Edition_Group_ISBN) AS b 
       ) ON (Books.Edition_Group_ISBN = b.Edition_Group_ISBN) 
 WHERE ISBN = 9780140447897

子选择(WHERE .. IN)和JOIN条件ID!= NULL是多余的。

你可以通过在Edition_Group_ISBN上进行自我加入来实现同样的目的:

SELECT b.*, count(b2.*)
FROM Books b INNER JOIN Books b2 ON (b.Edition_Group_ISBN=b2.Edition_Group_ISBN)
GROUP BY b.ISBN
HAVING b.ISBN = ...;

编辑: 修复是删除JOIN条件Edition_Group_ISBN!= NULL,因为此表达式将始终为false。 (对于!=的NULL操作数返回NLLL结果。)这使整个连接条件为NULL(false),因此左连接失败。

相关问题