今まであまり使う機会がなく知らなかったのだが、グループ化したカラム以外のカラム値をつなげて返してくれるこの関数はとても便利。
しかもDISTINCTも使えるのが最高に良い。(DISTINCTはUNIONでしか使えないと思っていた。。。)
使用例
tb_family
id |
1 |
2 |
3 |
tb_parent
id | parent_name | family_id |
1 | 山田 太郎 | 1 |
2 | 鈴木 花子 | 2 |
3 | 佐藤 次郎 | 3 |
4 | 山田 よしこ | 1 |
tb_student
id | student_name | family_id |
1 | 山田 息子 | 1 |
2 | 鈴木 息子 | 2 |
3 | 佐藤 息子 | 3 |
4 | 鈴木 娘 | 2 |
同じ家庭の保護者(parent)をグループ化して表示
1 2 3 4 5 6 7 8 9 10 |
SELECT `tb_family`.id AS family_id GROUP_CONCAT( `tb_parent`.parent_name ORDER BY `tb_parent`.id ASC SEPARATOR ',' -- カンマ区切り ) AS all_parent FROM `tb_family` LEFT JOIN `tb_parent` -- parentテーブル結合 ON `tb\_parent`.family_id = `tb\_family`.id GROUP BY `tb\_family`.id -- 家庭IDでグループ化 |
結果
family_id | all_parent |
1 | 山田 太郎,山田 よしこ |
2 | 鈴木 花子 |
3 | 佐藤 次郎 |
同じ家庭の保護者(parent)と学生(student)をグループ化して表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT `tb_family`.id AS family_id GROUP_CONCAT( `tb_parent`.parent_name ORDER BY `tb_parent`.id ASC SEPARATOR ',' -- カンマ区切り ) AS all_parent, GROUP_CONCAT( `tb_student`.student_name ORDER BY `tb_student`.id ASC SEPARATOR ',' -- カンマ区切り ) AS all_student FROM `tb_family` LEFT JOIN `tb_parent` -- parentテーブル結合 ON `tb\_parent`.family_id = `tb\_family`.id LEFT JOIN `tb_student` -- studentテーブル結合 ON `tb\_student`.family_id = `tb\_family`.id GROUP BY `tb\_family`.id -- 家庭IDでグループ化 |
結果
family_id | all_parent | all_student |
1 | 山田 太郎,山田 よしこ | 山田 息子,山田 息子 |
2 | 鈴木 花子,鈴木 花子 | 鈴木 娘,鈴木 息子 |
3 | 佐藤 次郎 | 佐藤 息子 |
このままだと保護者と学生の列数分ダブってしまうので、、、
同じ家庭の保護者(parent)と学生(student)をグループ化し、重複値は1つにまとめて表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT `tb_family`.id AS family_id GROUP_CONCAT( DISTINCT(`tb_parent`.parent_name) -- 重複削除 ORDER BY `tb_parent`.id ASC SEPARATOR ',' ) AS all_parent, GROUP_CONCAT( DISTINCT(`tb_student`.student_name) -- 重複削除 ORDER BY `tb_student`.id ASC SEPARATOR ',' ) AS all_student FROM `tb_family` LEFT JOIN `tb_parent` ON `tb\_parent`.family_id = `tb\_family`.id LEFT JOIN `tb_student` ON `tb\_student`.family_id = `tb\_family`.id GROUP BY `tb\_family`.id |
結果
family_id | all_parent | all_student |
1 | 山田 太郎,山田 よしこ | 山田 息子 |
2 | 鈴木 花子 | 鈴木 娘,鈴木 息子 |
3 | 佐藤 次郎 | 佐藤 息子 |