hotoolong's blog

RailsやVim、業務で気になったことを綴ってます

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