hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

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行で表示されるようになります。 力技なのであまり参考にならないかもしれないですが、表示させるのに困ったときには使ってみて下さい。