mysql 条件位运算实现多值存储

mysql 条件位运算实现多值存储,方法适合数据范围有限,且不会变更

在业务上往往会出现多选的情况:

例:选择 周一 至 周日 随意组合;

数据在设计时就会如何去储存,

一种是 一般是在储存是以某种方式隔开,

例如 1,,2,3代表选择了 周一、 周二、周三

另一种就是使用,mysql的位运算;字段类型为 int(3)

七个二进制位 分别代表 周一 至 周日 0未选 1选中

例: 选择了周一、 周二、周三

周日周六周五周四周三周二周一
0000111

对应 二进制位:0000111     数据库储存十进制:7

周     二进制     十进制
周一   0000001     1
周二   0000010     2
周三   0000100     4
周四   0001000     8
周五   0010000     16
周六   0100000     32
周日   1000000     64

数据库存的数据

idweeks
11
22
34
48
55
6127
7126
87
-- 查询包含周四的
SELECT * FROM test_weeks WHERE weeks & 8;
-- 查询不包含周四的
SELECT * FROM test_weeks WHERE !(weeks & 8);
-- 查询包含周一or周四的
SELECT * FROM test_weeks WHERE weeks & (1+8);
SELECT * FROM test_weeks WHERE weeks & 1 or weeks & 8;
-- 查询包含周一and周四的
SELECT * FROM test_weeks WHERE weeks & 1 and weeks & 8;

-- 新增周四周五
UPDATE test_weeks set weeks = weeks + 8 + 16 WHERE id = 3
-- 减少周四周五
UPDATE test_weeks set weeks = weeks - 8 - 16 WHERE id = 3

释:

-- 查询包含周四的
SELECT * FROM test_weeks WHERE weeks & 8;

查询结果

4    8
6    127
7    126

查到127是因为:

127     =    1111111
8       =    0001000
&
---->   =    0001000  = 8
结果不是0,即满足条件为 true,所以能查出来

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值