左连接不工作(MySQL)
我有一个表Books,在那里我存储图书数据(ISBN、标题、作者等)。为了区分哪些书是彼此的版本,我有一个字段Edition\u Group\u ISBN,它是组中任意的ISBN 我很难让这个查询正常工作,它应该提供图书数据和基于ISBN的其他版本的数量:左连接不工作(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
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。我忙着清理,第一次没注意到。乔治,多亏了这个修正,查询工作才得以进行。现在,我将花一些时间来测试一些