sql - Postgres 查询返回只有一位作者的书籍

标签 sql postgresql

我正在尝试进行查询,返回书籍中的书名、书籍摘要和作者姓名,其中只有一位作者按书籍 ID 排序。一本书可以有很多作者,一个作者可以写很多书,所以这是多对多的关系,但是我做错了什么或者忘记了什么。

我的表是:

book_tb(id, title, summary);
author_tb(id, name);
book_author_tb(id, book_id, author_id);

我试过:

SELECT b.title, b.summary, a.name 
FROM book_tb b
INNER JOIN book_author_tb ba ON b.id = ba.book_id
INNER JOIN author_tb a ON ba.author_id = a.id
GROUP BY b.title, b.summary, a.name, b.id
HAVING count(ba.author_id) = 1
ORDER BY b.id;

最佳答案

一种方法是:

SELECT b.title, b.summary, a.name 
FROM book_author_tb ba 
INNER JOIN book_tb b ON b.id = ba.book_id
INNER JOIN author_tb a ON a.id = ba.author_id
WHERE (
  SELECT COUNT(*) 
  FROM book_author_tb
  WHERE book_id = b.id
) = 1
ORDER BY b.id

这个:

SELECT COUNT(*) FROM book_author_tb WHERE book_id = b.id

确保返回的书籍只有一位作者。
另一种方式(可能更有效):

SELECT b.title, b.summary, a.name 
FROM (
  SELECT book_id, MAX(author_id) author_id 
  FROM book_author_tb
  GROUP BY book_id
  HAVING COUNT(*) = 1
) ba 
INNER JOIN book_tb b ON b.id = ba.book_id
INNER JOIN author_tb a ON a.id = ba.author_id
ORDER BY b.id

关于sql - Postgres 查询返回只有一位作者的书籍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56306996/

相关文章:

sql - 如何使用另一个表中的 MAX 值重置 MySQL AutoIncrement?

c++ - 如何使用 C++ libpqxx API 将二进制数据插入到 PostgreSQL BYTEA 列中?

sql - 在 SQL Server 中循环记录集

postgresql - Spark 从 Postgres JDBC 表读取速度慢

database - PostgreSQL:无法在规则的内部查询中引用 NEW

PostgreSQL:如何将函数定义导出到 SQL

sql - 将限制设置为 array_agg()

mysql - 我如何在子句Mysql中使用and with

一次选择中的 MySQL 查询选择性能和两个日期范围

mysql - 如何选择与随机列 MYSQL 不同的?