MySQLで関連テーブルの複数行を、カンマ区切り1行にする方法を教えてください

  • 5
    いいね
  • 0
    コメント

これは「コードを書いていて困ったときに、suinがチャットで質問に答えたり相談に乗るsuinのプログラミング相談室(仮)」で頂いた質問と僕の回答の要約です。

質問

下記図1のようなデータベースで、各articleが持ってるkeywordをカンマ区切りかつ一行で取り出す方法を教えてください。関連テーブルをJOINしてみたのですが、1行にまとめることができず複数行になってしまいます2

myapp.png

期待するアウトプットは次のようなものです:

articles.title keywords.name
article1 keyword1,keyword2,keyword3
article2 keyword1,keyword2
article3 keyword1,keyword2,keyword3

suinの回答

MySQLではGROUP_CONCAT関数でカンマ区切り1行にできます。

SELECT articles.title, GROUP_CONCAT(keywords.name) AS keywords FROM articles
  LEFT JOIN article_keywords
    ON articles.id = article_keywords.article_id
  LEFT JOIN keywords
    ON keywords.id = article_keywords.keyword_id
  GROUP BY articles.id
;

回答に対して頂いた反応

GROUP_CONCAT関数は知りませんでした!(suinも調べて知りました😂)。ありがとうございます!


  1. この図は質問者ではなくsuin作です。作成方法はSequelProでER図を出力する方法 - Qiita。 

  2. suin記: 質問者が試したSQLは省略します。