【问题标题】:Get books with 2 or more authors in SQL获取 2 位或更多作者的 SQL 书籍
【发布时间】:2019-11-03 04:44:35
【问题描述】:

所以我遇到了一个问题,我想获得超过两位作者的书籍。我是 T-SQL 的新手,所以我还不太懂。。

我的桌子是这样的

书桌:

     BOOK
---------------
book_id | title
---------------
   1    |   A
   2    |   B

作者表:

     AUTHOR
----------------
author_id | name
----------------
     1    | Nick
     2    | Clem
     3    | John

图书作者表:

  BOOK_AUTHOR
--------------------
book_id |  author_id
--------------------
   1    |     1
   1    |     2
   2    |     3

所以,正如您所看到的,我想要的预期输出是这样的:


 Author_id |  title  |       author_name
------------------------------------------
    1    |    A    | Nick
    2    |    A    | Clem

这是我正在执行的 SQL 查询:

SELECT a.Id, a.name, b.title, count(ba.idBook)
FROM BookAuthors as ba
JOIN Author as a
ON ba.IdAuthor = a.Id
JOIN book as b
ON ba.idBook = b.id
GROUP BY a.Id, a.name, b.title
HAVING count(ba.idBook) > 1

提前谢谢各位!

【问题讨论】:

  • 更改HAVING 子句中的数字。 > 0 表示一位作者符合条件。你想要的不止一个。
  • 已编辑:我已将其设置为 > 1 但输出为空白
  • 这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: sql join select count


【解决方案1】:

您可以使用子查询,它会查找所有拥有两个以上作者的图书 ID:

SELECT c.book_id
  FROM book_author c
  GROUP BY c.book_id
  HAVING count(c.book_id) >= 2

...然后在您的主查询中使用它,从您的联接表中获取所有作者和书籍,其书籍 ID 出现在子查询中:

SELECT ba.author_id, a.name AS author_name, b.title
FROM 
    book_author ba JOIN book b ON ba.book_id = b.book_id
    JOIN author a ON ba.author_id = a.author_id
WHERE
    b.book_id IN (SELECT c.book_id
                    FROM book_author c
                    GROUP BY c.book_id
                    HAVING count(c.book_id) >= 2);

【讨论】:

  • 这是正确答案。只是 a.author_name 它应该是 a.name 并且 b.book_title 应该是 b.title 根据表格。
  • @IsaAtaseven 感谢您指出这一点。我认为现在应该修复它
【解决方案2】:

您想要书籍有两个以上的作者。您的查询已接近,但您想排除特定作者信息:

SELECT b.Id, b.title, COUNT(*) as num_authors
FROM BookAuthors ba JOIN
     book b
     ON ba.idBook = b.id
GROUP BY b.id, b.title
HAVING COUNT(*) > 2;

问题似乎不是要您列出作者。如果是这样,一个方便的方法是STRING_AGG():

SELECT b.Id, b.title, COUNT(*) as num_authors,
       STRING_AGG(author_name, ', ') as authors
FROM BookAuthors ba JOIN
     book b
     ON ba.idBook = b.id
GROUP BY b.id, b.title
HAVING COUNT(*) > 2;

STRING_AGG() 是最近才添加到 SQL Server 中的,因此它可能在您使用的版本中不可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2013-10-19
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多