MySQLから1対多のデータを結合した状態で一発取得する
テーブル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 |
バッファローマン(超人)、キン肉マン(超人)、ウォーズマン(超人) |
※ウォーズマンはロボットで、超人じゃないかもしれないです