【MySQL】ビットフラグで格納されている値を、マスタテーブルで定義された日本語名に変換して出力するSQL
使っていた敏感肌用シャンプーが合わなくなってきたので、とうとう固形石鹸で頭を洗い始めました。こんにちは。fukasawaです。 髪はきしむけれど頭皮の状態はなんとなく安定です。乾燥する季節も終わったので、しばらくはこれでいいかも。
さて、現在関わっているプロジェクトでは、DB上にビットフラグを利用しているカラムがあります。正直あまり得意では無いのですが、古くからあるテーブルに定義されているものなので、なんとか頑張って付き合っています。
今回は「ビットフラグで格納されている値を、マスタテーブルで定義されてた日本語名に変換して出力する」SQLの書き方についてです。どのくらい需要があるのかは謎ですが。
SQLについて
サンプルテーブルです。動物マスタテーブルと、飼い主&飼っているペットが格納されているテーブルの2つを用意しました。(サンプル.sql)
↑このふたつのテーブルを結合して↓こう出力します。owners.petsの値が、動物マスタで定義した日本語名(カンマ区切り)に変換されて出力されています。
発行したSQLはこんな感じです。
select
o.id
, o.name
, o.pets
, group_concat(ma.name order by ma.bit_pos asc SEPARATOR '、') AS pet_list
from owners o left join mst_animals ma
on o.pets & ma.bit_pos group by o.id;
ざっくり解説していきます。
使われている関数について
過去記事に同じようなSQLの紹介記事を書いていて、そちらに簡単な説明を書いているので、必要に応じて参照してみてください。
SQLの動作について
まずは、group by を 外した状態で見てみます。
select
o.id AS o_id,
o.name AS o_name,
o.pets AS o_pets,
ma.bit_pos AS ma_bit_pos,
ma.name AS ma_name
from owners o left join mst_animals ma
on o.pets & ma.bit_pos order by o.id, ma.bit_pos;
出力結果はこんな感じです。
この結果をgroup byで飼い主ごとにまとめたのが最初のSQLです。ペットの種類はGROUP_CONCATで結合します。 (GROUP_CONCATで結合する際「order by ma.bit_pos 」をつけないと、バラバラの順番で結合されてしまうようです。)