mysql - 左连接不工作(MySQL)

标签 mysql join left-join

我有一个 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/

相关文章:

javascript - 如何在不使用 JQUERY 的情况下连接两个 JSON 对象的 JavaScript 数组?

java - Hibernate Left Outer Join问题: path expected on join

php - 困惑... MYSQL + JOIN + PAGINATION

php - Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 通过 GroupBY 左连接子查询?

java - 我可以通过单击java中第一帧中的按钮将记录插入到第二帧中吗? ( Swing )

php - MySQL/PHP 将单个记录连接到多个记录

mysql - SQL : Multiple left joins with similar tables

使用连接进行 MySQL 关注者查询

mysql - Ruby on Rails 不会更改为 mysql

MySQL从3个表中选择所有不同数量的行