2017-10-28 27 views
0

Ich habe einen klassischen Drei-Table-Join:SQL JOIN durch Verknüpfungstabelle verschmelzenden Duplikate Komma getrennt

  • Book (BookID, Titel, ...)
  • Person (PersonID, Namen ...)
  • PersonBookLink (BookID, PersonID, Rolle)

ich habe die klassische INNER JOIN:

SELECT Book.Title as title, Person.Name as author 
FROM PersonBookLink 
    INNER JOIN Book 
     ON PersonBookLink.BookID = Book.BookID 
    INNER JOIN Person 
     ON PersonBookLink.PersonID = Person.PersonID 
; 
Diese

funktioniert wie erwartet, aber ich kann mehrere Einträge für denselben Book haben, weil es kann mehr als ein Autor

Ich mag würde eine solche Aufzeichnungen fusionieren für jeden Book nur einen Eintrag aufweist und einem kombinierten author Feld in das Formular "Author1, Author2, ...". Ist das direkt mit SQL möglich?

Ich weiß, ich kann die Datensätze in der Ergebnismenge programmatisch zusammenführen, aber das ist ziemlich chaotisch und ich möchte, wenn möglich zu vermeiden.

Ich verwende derzeit eine SQLite3-Datenbank, wenn es darauf ankommt.

Hinweis: Ich sah this answer, aber ich muss die Ergebnisse nicht zählen, sondern sie zu verketten.

Antwort

1

Unten Abfrage kann Ihr Problem

SELECT Book.Title as title, group_concat(Person.Name) as author 
FROM PersonBookLink 
INNER JOIN Book ON PersonBookLink.BookID = Book.BookID 
INNER JOIN Person ON PersonBookLink.PersonID = Person.PersonID 
GROUP BY Book.Title 

Group_concat nimmt ein optionales zweites Argument (String) lösen als die Verkettung Separator zu verwenden, wenn Sie nicht einen einzigen wollen ‚‘ Charakter.

1

Sie benötigen einen GROUP BY und GROUP_CONCAT():

SELECT b.Title, GROUP_CONCAT(p.Name, ', ') as authors 
FROM PersonBookLink pbl INNER JOIN 
    Book b 
    ON pbl.BookID = b.BookID INNER JOIN 
    Person p 
    ON pbl.PersonID = p.PersonID 
GROUP BY b.Title; 

Bitte beachte, dass ich Tabellen-Aliases in Ihre Abfrage eingeführt. Sie machen die Abfrage einfacher zu schreiben und zu lesen.

Verwandte Themen