2015年9月4日金曜日

MySQLで別テーブルのとあるフィールドをまとめて取得するには的なお話

  • このエントリーをはてなブックマークに追加

MySQLでたまに1つのカラムの中に複数のデータを入れたいという事がある。
なんていうかすごく場面が限定されるというかよくわかりにくい話なので、
とりあえず何だかよくわからないけどこういう結果を取得したいときにはこうすればいいよ的なお話をば。

場面としては投稿に紐づいているタグも合わせて一つのSQL文で取得したいみたいな。
ちなみにテーブルは下記のような感じ。

// post_tbl
post_id , title , created

// tag_tbl
tag_id , post_id , tag_name
で、下記のSQL文を回してあげるとやりたい事が出来るはず。
SELECT
  post_id
  title
  (SELECT GROUP_CONCAT(tag_name ORDER BY tag_id ASC) FROM tag_tbl WHERE tag_tbl.post_id = post_tbl.post_id) as tags
  created
FROM post_tbl
投稿に紐づいているタグ名をカンマ区切りで取得出来るみたいな。
ちなみにgroup_concat内でorder by出来るので、いかようにもソートしちゃえるみたいな。

ってな感じで使うといいんじゃないかと。
とりあえずはこんな感じで結果を取得して、for文内でtagsを分割してあげるとか。

ただ出来たらカンマ区切りの文字列が入るとかではなくて配列を取得したいけど、
それはMySQLでは出来ないからしょうがないとのことであえてこうするしかないんじゃないかと。
もし配列でやりたいとするならば別カラムを用意してそこにtag_idをgroup_concatするとかみたいな。

ぶっちゃけMySQL系の関数は使わないでも大体の事は出来るけど、使うとやっぱ便利だよ的な。

Adsense