(书摘备查)
实例一
问题提出:
假设有这样一个任务:一个超市需要记录每个顾客每次来超市都购买了哪些商品。为了将问题简单化,假设该超市是有面包、牛奶、饼干、啤酒四种商品。
解决方案:
用一个字段表示顾客购买商品的信息,这个字段是数值型的,存储一个十进制数字。当它转换成二进制的时候,每一位代表一种商品,如果所在位是“1”表示顾客购买了该种商品,“0”表示没有购买该种商品。比如数值的第一位代表面包,第二位代表牛奶,第三位代表饼干,第四位代表啤酒。如果一个顾客购物单的商品列的数值是5,那么二进制表示为0101,这样从左往右第二位和第四位是1,那么就可以知道这个顾客购买了牛奶和啤酒,而如果这个顾客有这样的购物单(在数据库中就是多条记录),则把这些购物单按用户分组做bit_or()操作就可以知道这个用户都购买过什么商品。
create table order_rab (id int, customer_id int, kind int);
insert into order_rab values (1,1,5), (2,1,4);
insert into order_rab values (3,2,3), (4,2,4);
select * from order_rab;
用bit_or()函数与group by子句统计每个顾客购买过什么商品:
select customer_id, bit_or(kind) from order_rab group by customer_id;
可以看到顾客1的bit_or()结果是5即0101,表示这个顾客在本超市购买过牛奶和啤酒;顾客2的bit_or()结果是7即0111