FuelPHP/MySQLでカンマ区切りの格納データに対する存在条件

  • このエントリーをはてなブックマークに追加
こんにちは、岡本です。 カンマ区切りの格納データに対して抽出条件を指定する際、みなさんはどうされているでしょうか。以外と知られていない(?)便利な関数がfind_in_setです。 https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html
FIND_IN_SET(str,strlist) 文字列 strN 部分文字列で構成される文字列リスト strlist 内にある場合は、1 から N までの範囲内の値を返します。文字列リストは、, 文字で区切られた部分文字列で構成された文字列です。最初の引数が定数文字列で、2 番目が SET 型のカラムの場合、FIND_IN_SET() 関数はビット演算を使用するために最適化されます。strstrlist 内にない場合、または strlist が空の文字列の場合は、0 を返します。引数のいずれかが NULL である場合は、NULL を返します。最初の引数にカンマ (,) 文字が含まれる場合は、この関数が正しく動作しません。
id name hoge_cd
1 佐藤 1,11
2 鈴木 2
3 岡本 3,13
こんな感じですね。 select * from sample where find_in_set(3, hoge_cd); 多少制限があるので注意は必要ですが、データの規則が担保されているならreplaceを絡めて色々な局面で使えそうです。(likeはだめですよ) が、久々に使って今回嵌ったのはFuelPHPのQuery Builderでのjoin利用でした。 ->where(DB::expr('find_in_set(t1.hoge_cd, t2.hoge_cd)')) ん、いける。あ、outer join だった。 ->on(DB::expr('find_in_set(t1.hoge_cd, t2.hoge_cd)')) Missing argument 2 for Fuel\Core\Database_Query_Builder_Select::on() why... Query Builderではon句は引数3つが必須なんですね。 ->on(DB::expr('find_in_set(t1.hoge_cd, t2.hoge_cd)'), '>', DB::expr(0))  
  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*