8

我的 MySQL 数据库中有 3 个表,它们具有以下结构:

书台:

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

作者表:

     AUTHOR
----------------
author_id | name
----------------
     1    | John
     2    | Bush
     3    | Alex
     4    | Bob

然后我有一个连接表,它在表 book 和 author 之间建立了多对多的关系,这意味着一本书可以由许多作者(即合着)写,一个作者可以有许多他或她写过。

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

是否可以通过 SQL 或 MySQL 让 DBMS 输出如下内容:

 book_id |  title  |       authors
------------------------------------------
    1    |    A    | John, Bush, Alex, Bob
    2    |    B    | Alex, Bob

输出中的作者行是与特定书籍关联的所有作者的串联。

4

2 回答 2

17

由于您正在使用MySQL,请使用GROUP_CONCAT()来连接每个组的行。

SELECT  a.Book_ID, 
        a.Title,
        GROUP_CONCAT(c.Name ORDER BY c.Name) Authors
FROM    Book a
        INNER JOIN book_author b
            ON a.Book_ID = b.Book_ID 
        INNER JOIn Author c
            ON b.Author_ID = c.Author_ID
GROUP   BY a.Book_ID, a.Title

输出

╔═════════╦═══════╦════════════════════╗
║ BOOK_ID ║ TITLE ║      AUTHORS       ║
╠═════════╬═══════╬════════════════════╣
║       1 ║ A     ║ Alex,Bob,Bush,John ║
║       2 ║ B     ║ Alex,Bob           ║
╚═════════╩═══════╩════════════════════╝
于 2013-04-08T12:47:49.877 回答
1

这很好地解释了多对多关系和 3 个表如何从中提取数据。

最重要的是,我想为 Oracle 人员提供定制的解决方案 bcz Sql 和 Oracle 没有相同的语法,而且很难在网上找到......所以享受......

SELECT  book.BOOK_ID, book.BOOK_TITLE, 
listagg (CONCAT(CONCAT(author.AUTHOR_FIRSTNAME, ' '),author.AUTHOR_LASTNAME), ',') 
WITHIN GROUP 
(ORDER BY author.AUTHOR_FIRSTNAME) FirstName
FROM    Books book
        INNER JOIN authorbooks ab
            ON ab.BOOKS_ID = book.BOOK_ID
        INNER JOIN Authors author
            ON ab.Author_id = author.Author_ID
GROUP BY book.BOOK_ID, book.BOOK_TITLE;

这将以良好的格式打印,包括名字和姓氏..

于 2015-04-27T22:26:02.107 回答