22
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLから1対多のデータを結合した状態で一発取得する

Last updated at Posted at 2016-11-11

##MySQLから1対多のデータを結合した状態で一発取得する

  • まずMySQLにテーブルを用意する

テーブル1 tb_category

cat_id category_name
101 人間
102 超人

テーブル2 tb_entry_name

cat_id entry_name
101 千代の富士
101 王貞治
101
101 霊長類最強女子
102 バッファローマン
102 キン肉マン
102 ウォーズマン

##cat_idで紐づくentry_nameをすべて読点でつながった状態で取得したい

  • ほしい結果は以下の表の様になります。
category_name entry_name
人間 千代の富士、王貞治、霊長類最強女子
超人 バッファローマン、キン肉マン、ウォーズマン

##そのSQLはこちら

select a.category_name,
 group_concat(distinct b.entry_name, order by b.cat_id separator '、')
 from tb_category as a inner join 
 tb_entry_name as b
 on a.cat_id = b.cat_id
 WHERE b.entry_name != ''
 group by b.cat_id
 order by a.cat_id;

##ポイント

  • WHERE b.entry_name != '' ←この文がないと、nullの行まで連結しちゃいます。(千代の富士、王貞治、、霊長類最強女子)
  • group by b.cat_id ←これを入れないとcat_idごとのグループでわかれてくれませんので、ご注意ください。

##固定の文字を追加する場合(例えば、カッコをつけたい場合)

select a.cat_id,
 group_concat(distinct b.entry_name,'(',a.category_name,')' order by b.cat_id separator '、')
 from tb_category as a inner join 
 tb_entry_name as b
 on a.cat_id = b.cat_id
 WHERE b.entry_name != ''
 group by b.cat_id
 order by a.cat_id;
  • 結果はこちら
cat_id entry_name
101 千代の富士(人間)、王貞治(人間)、霊長類最強女子(人間)
102 バッファローマン(超人)、キン肉マン(超人)、ウォーズマン(超人)

※ウォーズマンはロボットで、超人じゃないかもしれないです

22
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?