Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
左连接不工作(MySQL)_Mysql_Join_Left Join - Fatal编程技术网

左连接不工作(MySQL)

左连接不工作(MySQL),mysql,join,left-join,Mysql,Join,Left Join,我有一个表Books,在那里我存储图书数据(ISBN、标题、作者等)。为了区分哪些书是彼此的版本,我有一个字段Edition\u Group\u ISBN,它是组中任意的ISBN 我很难让这个查询正常工作,它应该提供图书数据和基于ISBN的其他版本的数量: SELECT *, Editions_Count FROM Books LEFT JOIN ((SELECT Edition_Group_ISBN, COUNT(*) AS Editions_Count

我有一个表Books,在那里我存储图书数据(ISBN、标题、作者等)。为了区分哪些书是彼此的版本,我有一个字段Edition\u Group\u 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的图书数据,但它提供的版本计数为NULL,表明左连接不起作用。

尝试此更简单的查询:

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\u Group\u ISBN)
,这意味着计算该表达式为非空的组中的所有行


但是不能使用
g.*
,因为它不明确。它是否计算组中的所有行?(如果是,只需使用
COUNT(*)
)是否对组中的非空行进行计数?这意味着什么呢?计算
g
中的所有列都不为空的行,或者
g
中的任何列都不为空的行?出于这些原因,
COUNT(g.*)
在SQL语言中根本不是一个合法的解释。

试试这个简单得多的查询:

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\u Group\u ISBN)
,这意味着计算该表达式为非空的组中的所有行


但是不能使用
g.*
,因为它不明确。它是否计算组中的所有行?(如果是,只需使用
COUNT(*)
)是否对组中的非空行进行计数?这意味着什么呢?计算
g
中的所有列都不为空的行,或者
g
中的任何列都不为空的行?由于这些原因,
COUNT(g.*)
在SQL语言中根本不是一个合法的解释。

该查询似乎包含许多重言式语句,这些语句总是正确的

我想你可以把它简化为

 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
子选择(其中..IN)和连接条件ID=空值是多余的

您可以通过在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 = ...;
编辑:
修复方法是删除连接条件版本\u组\u ISBN=NULL,因为此表达式将始终为false。(一个空操作数到!=返回一个NLLL结果。)这使得整个连接条件为空(false),因此左连接失败。

查询似乎包含许多重言式语句,这些语句总是true

我想你可以把它简化为

 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
子选择(其中..IN)和连接条件ID=空值是多余的

您可以通过在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 = ...;
编辑:

修复方法是删除连接条件版本\u组\u ISBN=NULL,因为此表达式将始终为false。(一个空操作数到!=返回一个NLLL结果。)这使得整个连接条件为空(false),因此左连接失败。

我认为您需要另一个表来跟踪编辑分组;用一个ISBN来做这件事给我敲响了警钟。@statisan我确实觉得用这种方式存储有点奇怪,但实际的缺点是什么?好处是:1-它的方式更容易将数据加载到数据库中。如果有一个唯一的ID 2,那就更难了——它可以节省一点数据库空间,而给出的答案只需要一本书就可以了。。我想知道它们是否可以用这样的方式来编写,以便与多个ISBN一起使用。其不利之处在于,您正在使用ISBN。您的代码还必须知道,ISBN也可以表示所有版本,对于其中一个版本,它将与ISBN相同;用一个ISBN来做这件事给我敲响了警钟。@statisan我确实觉得用这种方式存储有点奇怪,但实际的缺点是什么?好处是:1-它的方式更容易将数据加载到数据库中。如果有一个唯一的ID 2,那就更难了——它可以节省一点数据库空间,而给出的答案只需要一本书就可以了。。我想知道它们是否可以用这样的方式来编写,以便与多个ISBN一起使用。其不利之处在于,您正在使用ISBN。您的代码还必须知道,ISBN也可以表示所有版本,对于其中一个版本,它将与ISBN相同。实际上
ID!=空的
是不正确的,应该是
ID不是空的
谢谢你的回答。这可能就是它不起作用的原因。比较器运算符!=如果其中一个操作数为NULL,则返回NULL。我忙着清理,第一次没注意到。乔治,多亏了这个修正,查询工作才得以进行。现在,在选择答案之前,我将花一些时间来测试这里建议的一些更好的查询。嗯,我真的很好奇为什么ID!=NULL阻止查询工作..请查看我的编辑。到的空操作数!=产生一个空结果。实际上
ID!=空的
是不正确的,应该是
ID不是空的
谢谢你的回答。这可能就是它不起作用的原因。比较器运算符!=如果其中一个操作数为NULL,则返回NULL。我忙着清理,第一次没注意到。乔治,多亏了这个修正,查询工作才得以进行。现在,我将花一些时间来测试一些