假设我有两个包含这些数据的表:

author
id | name
---------
1  | John
2  | Jack
3  | James
4  | Bob
5  | Gorge

book
id | author_id | title  | state
-------------------------------------
1  | 1         | book_1 | published
2  | 1         | book_2 | pre-published
3  | 1         | book_3 | published
4  | 1         | book_4 | rejected
5  | 2         | book_5 | published
6  | 3         | book_6 | rejected
7  | 3         | book_7 | pre-published
8  | 4         | book_8 | rejected

我想要的是一个SQL查询,它可以给我每个作者的ID以及出版的图书的名称和编号,即使他们已经出版了0本.我认为这可能是一个简单的问题,但我坚持了下来,我想要的是:

id | name   | num_of_published_books
------------------------------------
1  | John   |          2
2  | Jack   |          1
3  | James  |          0
4  | Bob    |          0
5  | Gorge  |          0

我可以取到前两排的第JohnJack行.我还可以根据author_idstate对它们进行分组.但这不是我想要的.

请注意,我不想使用子查询.

推荐答案

SELECT
  a.id AS author_id,
  a.name,
  COUNT(b.state = 'published' OR NULL) AS num_of_published_books
FROM
  author a
LEFT JOIN
  book b ON a.id = b.author_id
GROUP BY
  a.id, a.name;

希望它能对你有所帮助.


  1. b.state = 'published',我们可以删除已出版的书籍,结果是false(0)true(1).
  2. 当上一步的结果是false(0)时,OR NULL就是NULL.在我的记忆中,当使用OR运算符来比较非空值和NULL值时,结果总是NULL.将忽略COUNT Will NULL.
  3. 有两种可能的结果:true(1) OR NULLfalse(0) OR NULL,它们的结果分别是true(1)NULL.
  4. 最后,Count计算不是NULL的数字.

Sql相关问答推荐

如何在T—SQL中找到值更改之前的日期?

SQL Google Sheets:UNIQUE/DISTINCT和编码查询函数

从2个表中查找每条记录的唯一最接近的日期匹配

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

SQL计数条目大于日期,包括交叉表中的零

数组列的postgres更新查询

Oracle PL/SQL:解决DBMS输出大小限制的问题

在SQL中,筛选其他列中只有一个值的ID

根据具有特定值的 ID 创建自定义组

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

如何为 ActiveRecord 联接应用附加条件

SQL:考虑合并分支计算分支的增长百分比

清理 XML 数据

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

将 MERGE 语句与 Oracle PL/SQL 表类型一起使用时,导致无效数据类型错误的原因是什么?

SQL Server 分区和 Run Case 语句

Select 给定类别列表(或更多类别)中的所有事物

在 sql 中合并系列以删除重复项

REGEXP 用于字符串格式化以对用空格分隔的字符和数字进行分组