MySQLのgroup_concatをつかって複数の項目を1行に並べる
1対多のテーブル構成を多になっているテーブルの情報をgroup_concatを使って表示したくなるケースがあったのですが、 単純に1カラムのデータだけを表示する場合はそのまま使えばいいのですが、 複数を一気に選択することができず、副問合せして取得しました。
usersテーブル、user_optionsテーブルがあるとして 普通にgroup_concatを使ってオプションの名前を登録順に取得するケースは以下になります。
select users.id, group_concat(distinct user_options.name order by user_options.created_at separator ', ') from users left outer join user_options on user_options.user_id = users.id
これに対してuser_optionsの複数の項目(nameと登録日)を追加したい場合は joinしてるテーブルを副問合せしてしまって以下のようにしました。
select users.id, group_concat(distinct user_options.name_created_at order by user_options.created_at separator ', ') from users left outer join ( select id, concat(id, '(', date_format(convert_tz(created_at, '+0:00','+9:00'), '%Y-%m-%d'), ')') as name_created_at, created_at from user_options ) user_options on user_options.user_id = users.id
このようにすることで,区切りで名称(登録日)の情報が1行で表示されるようになります。 力技なのであまり参考にならないかもしれないですが、表示させるのに困ったときには使ってみて下さい。