这篇文章主要介绍Mysql位运算简化一对多关系的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

语法

& : 按位与,二进制位同时都为1的位设为1。
| : 按位或,二进制位有一个位为1就为1.
^ : 按位异或,对应位的二进制数不同时,对应位的结果才为1;如果两个对应位数都为0或者都为1,则对应位的结果为0。

原理

$a=6转化为2进制为110$b=3转化为2进制为11$a&$b即是110与11将$a和$b中都为1的位设为1,位数不够的补0.即110与011运算结果010,转化为十进制结果为2

应用场景

每个景点包含很多属性,例如适合旅游的月份,我们一般的做法可能有两种:

是增加一个varchar字段,每个月份之间用一个特殊符号分隔保存,例如:"1,2,22,65,7"

建立一个关系表,在这里不能使用1-12的数字来表示月份,而是使用1,2,4,8,16,32,64,128,512,1024,2048,4096来表示,如果是多个月份,可以相互组合相加,之后存储为一个值。
比如 1,10,12月份,就可以存储1+512+4096=4609,4096 这个值。

这个技巧适用于属性较少的一对多的场景,可以存储1个或者多个,太多的话还是推荐试用关系表。常用的属性有:月份,消息提醒类型,各种有限的类型组合等等。

使用技巧:

--添加一个分类用“|”SELECT(4|2|1);---=7--去掉一个分类,用“^”SELECT7^1;--当我们需要查询某个月份的景点时,例如查询3月份的景点,可使用以下语句:SELECT*FROM`spots`WHERE`month`&4=4;--当设置某个景点适合某个月份时,例如设置4325的景点适合2月份,可使用下面的语句:UPDATE`spots`SET`month`=`month`|2WHERE`id`=4325--当取消设置某个景点的月份时,可使用下面的语句:UPDATE`spots`SET`month`=`month`^2WHERE`id`=4325--查询同时适合多个月份的数据,例如需要查询设置了11,12,1月份的景点,将其三个月份对应的数值加起来,结果为6145,然后使用这个数值进行查询:SELECT*FROM`spots`WHERE`month`&6145=6145--查询只要适合,1,11,12月份其中一个月份的景点就行SELECT*FROM`spots`WHERE(`month`&4096=4096)or(`month`&2048=2048)or(`month`&1=1)

以上是“Mysql位运算简化一对多关系的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!