2013-04-08 18 views
5

Ich habe 3 Tabellen in meiner MySQL-Datenbank, die die folgenden Strukturen aufweisen:SQL: 3-Tabellen (Buch, Autor, BOOK_AUTHOR)

Buch Tabelle:

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

Autor Tabelle:

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

Und dann habe ich eine Junction-Tabelle, die eine Viele-zu-viele-Beziehung zwischen den Tabellen Buch und Autor etabliert, was bedeutet, dass ein Buch von vielen Autoren geschrieben werden kann (coauthored, dh) und ein Autor kann viele Bücher haben er oder sie hat geschrieben.

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

Ist es möglich, mit Hilfe von SQL oder MySQL das DBMS ausgeben, so etwas zu bekommen:

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

Die Reihe Autoren in der Ausgabe ist eine Verkettung alles mit einem bestimmten zugehörigen Autoren Buch.

Antwort

11

Da Sie MySQL verwenden, verwenden Sie GROUP_CONCAT(), um die Zeilen für jede Gruppe zu verketten.

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 

OUTPUT

╔═════════╦═══════╦════════════════════╗ 
║ BOOK_ID ║ TITLE ║  AUTHORS  ║ 
╠═════════╬═══════╬════════════════════╣ 
║  1 ║ A  ║ Alex,Bob,Bush,John ║ 
║  2 ║ B  ║ Alex,Bob   ║ 
╚═════════╩═══════╩════════════════════╝ 
+0

Vielen Dank. Das scheint ziemlich gut zu funktionieren. – Mikhail

+0

Sie sind willkommen ': D' –

+0

+1 nette Antwort. – Kermit

1

, die für viele zu viele Beziehung und 3 Tische sehr gute Erklärung war, wie Daten aus ihnen zu ziehen.

Vor allem möchte ich eine maßgeschneiderte Lösung für Oracle Leute bcz SQL- und Oracle geben, haben nicht gleiche Syntax und es wird auf die Netto schwer zu finden sein ... So genießen ..

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; 

Dieser Wille Drucken Sie in einem guten Format einschließlich Vorname und Nachname ..