裏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 を返す。