按位与或运算在业务当中的应用
##1. 与或运算:
1、位或运算符 ( | ) :对应的二进制位有一个或两个为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> SELECT 10 | 15 , 9 | 4 | 2 ;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 | # 10的二进制为1010,15的二进制为1111,按位或运算之后结果为1111,即15
+---------+-----------+ # 9的二进制为1001,4的热禁止为0100,2的二进制为0010,按位或运算之后结果为1111,即15
| 15 | 15 |
+---------+-----------+
2、位与运算符 ( & ) :对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> SELECT 10 & 15 , 9 & 4 & 2 ;
+---------+-----------+
| 10 & 15 | 9 & 4 & 2 |
+---------+-----------+
| 10 | 0 |
+---------+-----------+
##2. 应用场景:
###2.1
商场系统中,有一个产品属性和产品类目属性,一个产品可能属于多个类目,在依据类目做查询时需要把属于该类目的所有产品查询出来,一般情况下我们的解决办法是,
把该产品所属的类目用分隔符按字符串形式保存到,比如
商场中白菜这个产品,白菜属于蔬菜类目1和抢购商品类目2,那么保存为(1,2),当查询所有抢购商品时,用like(‘,%2%’)等方式做查询,在数据量大的时候,这种查询效率太低,
此时可以考虑用与或运算。
###2.2
1. 产品类目用2的指数来表示:比如下图;
2. 如果一个商品属于多个类目,则用多个类目的值做或运算,比如 既是蔬菜又是限时抢购,则该产品的类目为16|1024=1040;
3. 当查询抢购商品时,用与运算,cat & #{cat},比如查询抢购商品时以下sql:
select * from product where cat & 1024
此sql的意思是:查询cat为cat$1024=1024的数据,所以1040&1024 =1024, 该条数据是可以被查询出来的;
###2.3 注意:
类型不易太多,如果类型太多容易出现重复数据,查询结果可能不够准确;