今まであまり使う機会がなく知らなかったのだが、グループ化したカラム以外のカラム値をつなげて返してくれるこの関数はとても便利。
しかも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 | 佐藤 次郎 | 佐藤 息子 |