##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 | バッファローマン(超人)、キン肉マン(超人)、ウォーズマン(超人) |
※ウォーズマンはロボットで、超人じゃないかもしれないです