2013-04-08 9 views
5

mam 3 tabele w mojej bazy danych MySQL, które mają następujące struktury: stółSQL: 3 stoły (książka, autor, BOOK_AUTHOR)

Book:

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

Autor tabela:

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

A potem mam stół łączący, który ustanawia relację wiele do wielu między książką a autorem, co oznacza, że ​​książkę może napisać wielu autorów (co jest współautorem), a autor może mieć wiele książek on lub ona napisała.

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

Czy jest możliwe za pomocą SQL lub MySQL, aby uzyskać DBMS do wyjścia coś takiego:

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

autorów wiersz wyjścia jest połączeniem wszystkich autorów związanych z określonym książka.

Odpowiedz

11

Ponieważ używasz MySQL, użyj GROUP_CONCAT(), aby połączyć wiersze dla każdej grupy.

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 

WYJŚCIE

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

Wielkie dzięki. Wydaje się, że działa całkiem dobrze. – Mikhail

+0

Nie ma za co ": D' –

+0

+ 1 fajna odpowiedź. – Kermit

1

To było bardzo dobre wyjaśnienie dla wielu do wielu relacji i 3 stoły jak ściągania danych z nimi.

Przede wszystkim chcę dać dostosowanego rozwiązania Oracle ludzi bcz SQL i Oracle nie mają tej samej składni i trudno będzie znaleźć na net ... Więc cieszyć ..

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; 

Ta wola drukuj w dobrym formacie, w tym imię i nazwisko.