2017-10-28 11 views
0

をカンマ区切り重複をマージするリンクテーブルを介して参加:SQLは、私は、古典的な三つのテーブルには、参加してい

  • ブック(BookID、タイトル、...)
  • は人(PERSONID、名前、... )
  • PersonBookLink(BookID、PERSONID、役割)

私は古典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 
; 

この期待通りに動作しますが、私はそれを持っている可能性があるため、同じBookのための複数のエントリを有することができるより1本の著者その後、

私は各 Bookと組み合わせる author分野でのためのちょうど一つのエントリを有するそのようなレコードをマージしたい

フォーム"Author1, Author2, ..."。これはSQLで直接可能ですか?

私はプログラムで結果セット内のレコードをマージすることができますが、それはむしろ乱雑であり、可能ならば避けたいと思います。

現在、SQLite3データベースを使用しています(問題がある場合)。

注:私はthis answerを見ましたが、結果を数えずに連結する必要はありません。私はあなたのクエリにテーブルの別名を導入

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; 

注:

答えて

1

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を使用すると、単一の「」文字を使用しない場合は連結セパレータとして使用するには、オプションの第二引数(文字列)を取り、あなたの問題を解決することができます。

1

あなたがGROUP BYGROUP_CONCAT()必要です。彼らは、クエリをより簡単に書いて読めるようにします。クエリ以下

関連する問題