カンマ区切りのデータ検索に便利「FIND_IN_SET」

MySQLには、とっても便利な「FIND_IN_SET」という関数があります。
どう便利かと言いますと、カンマなどの区切り文字付きで保存されたデータ検索に
便利なのです。良く分からないと思いますので、例を挙げて説明します。

例えば、社員プロフィールを管理するテーブルの場合、基本的な管理情報は
下記のようになると思います。

カラム データ
id ID 0001
name 名前 佐藤
addr 住所 東京都豊島区
tel 電話番号 03-5961-5681
email メアド info@cyberbrain.co.jp

基本情報は、誰が作ってもこんな感じになると思いますが、スキル情報として
習得しているプログラミング言語を保存する場合はどうでしょうか。

言語はCやJAVAなどある程度決まっており、1つの人もいれば複数の人もいるので、
入力フォームではチェックボックスが最適でしょう。

正攻法でやるならば、まず各言語にコードを付けたマスターテーブルを作成し、
スキル情報保存テーブルをまた別に作成し、スキルがあるだけ社員idとスキルコードの
情報を1対1で保存します。

この場合、たかがスキル情報のために、別途2つのテーブルを作成しなければなりません。
もっと大掛かりなシステムであれば必要ですが、拡張の予定が無いシステムであれば
もっと簡単に作りたいと思ってしまいます。

そこで考えられるのが、スキルコードが複数ある場合には、カンマなどの区切り文字で
保存する方法です。これであれば、同じテーブル内の1カラムで保存できますからね。

※今回は「FIND_IN_SET」の紹介なので、「ビットで保存すれば?」などのツッコミはご遠慮ください

カラム データ
id ID 0001
name 名前 佐藤
addr 住所 東京都豊島区
tel 電話番号 03-5961-5681
email メアド info@cyberbrain.co.jp
skills スキル 1,3,5

※スキル名はテキストで保存しちゃいます

さぁ、ここである条件の場合に問題が発生します。スキルコードが1~10まで
であれば、普通に「skill like ‘%1%’」などで取得できますが、
11以降になると、このwhere句では「1と11」の両方を引っ張ってしまいます。

「skill like ‘%1,%’」にしちゃったら、1だけの人が取れないし、仮に
1が最後に入っている場合も取得できません。

orで色々組み合わせれば何とかなりますが、結局面倒ですよね・・・・

もうお気づきだと思いますが、そんな時に便利なのが「FIND_IN_SET」なのです。
細かい説明はしません。以下のSQL文で1発解決です。

select * from table where find_in_set(‘1′, skills);