【问题标题】:SQL: 3 tables (book, author, book_author)SQL:3 个表(书、作者、书作者)
【发布时间】:2013-03-30 13:14:31
【问题描述】:

我的 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

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

【问题讨论】:

    标签: mysql sql join concatenation


    【解决方案1】:

    由于您使用的是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           ║
    ╚═════════╩═══════╩════════════════════╝
    

    【讨论】:

      【解决方案2】:

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

      最重要的是,我想为 Oracle 人员提供一个定制的解决方案,因为 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;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多