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 の間に多対多の関係を確立するジャンクション テーブルがあります。つまり、1 つの本は多くの著者によって書かれ (つまり、共著)、1 人の著者は複数の本を持つことができます。彼女は書いた。

    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

出力の author 行は、特定の書籍に関連付けられているすべての著者を連結したものです。

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 に答える