裏MySQLクエリー入門(11) 実践編1 集約関数 BIT_AND,BIT_OR,BIT_XOR
MySQLの集約関数にはBIT_AND,BIT_OR,BIT_XOR等、ビット演算子系の集約関数があります。具体的な使用例をあまりみることがないので、今回はこの関数の使いどころを紹介したいと思います。
例えばユーザーのアイテムテーブルからアイテムID 1,3,5,7の全ての取得履歴があるユーザーのユーザーIDとユーザー名を取得する
というのはSQLで一撃で出すのは以外とメンドクサイです。
MySQLならあると思った論理演算和(BIT_OR)
使うとこんな感じでできます。
リスト→ビット変換→OR
SELECT uid,name FROM user u WHERE EXISTS ( SELECT * FROM user_item ui WHERE ui.uid = u.uid AND item_id IN (1,3,5,7) GROUP BY uid HAVING bit_or((1 << (field(item_id,1,3,5,7)-1)))=(1<<4) )
BIT_OR(expr)
expr のすべてのビットに対するビットごとの OR を返す。この計算は 64 ビット
(BIGINT)の精度で実行される。マッチするレコードがない場合、この関数は 0 を返す。