MySQLのSET型カラムはFIND_IN_SET関数で検索する
MySQLには多種多様なデータ型がありますが、その中でもSET型というものが時と場合によってはかなり有用です。
SET型はENUM型と同じく、あらかじめ決めておいた種類の値のみを受け付ける動作をしますが、違いがありENUM型は1つの値を保持できますが、SET型は複数の値を保持できます。
言い換えるなら、ENUM型はラジオボタン、SET型はチェックボックスという感じですかね、余計に分かりづらくなったらすみません。
で、仕事上このSET型を使う機会がまあまああったんですが、そのカラムを条件に検索をしたいと思った時にいつも部分一致のLIKE検索をしていました。
それはそれで正解なんですが、ちゃんとSET型を検索する為の関数が用意されていました。
FIND_IN_SET
その関数とは、もう関数名を見れば一目瞭然ですがFIND_IN_SET関数です。
使い方としては引数を2つ指定します、1つ目の引数に検索したい値を入れ、2つ目の引数に検索の対象となるSET型のカラムを指定します。
SELECT * FROM hoge WHERE FIND_IN_SET('huga', set_data_column)
余談ですが引数の指定に違和感がありまして、なんとなく1つ目と2つ目の引数の順番が逆の方がしっくりくるのはなんででしょうね。
※多分なんですがJavaとかの引数指定では1番目の引数で「何から」を指定する関数が多いからな気がします
LIKE検索でもSET型はカンマ区切りでデータが格納されているので検索可能ですが、こっちの関数を使った方が見栄えも良い気がします。
ちなみにこっちの関数を使用した場合でもインデックスは効きません、注意しましょう。