mysql 条件位运算实现多值存储,方法适合数据范围有限,且不会变更
在业务上往往会出现多选的情况:
例:选择 周一 至 周日 随意组合;
数据在设计时就会如何去储存,
一种是 一般是在储存是以某种方式隔开,
例如 1,,2,3代表选择了 周一、 周二、周三
另一种就是使用,mysql的位运算;字段类型为 int(3)
七个二进制位 分别代表 周一 至 周日 0未选 1选中
例: 选择了周一、 周二、周三
周日 | 周六 | 周五 | 周四 | 周三 | 周二 | 周一 |
0 | 0 | 0 | 0 | 1 | 1 | 1 |
对应 二进制位:0000111 数据库储存十进制:7
周 二进制 十进制
周一 0000001 1
周二 0000010 2
周三 0000100 4
周四 0001000 8
周五 0010000 16
周六 0100000 32
周日 1000000 64
数据库存的数据
id | weeks |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
4 | 8 |
5 | 5 |
6 | 127 |
7 | 126 |
8 | 7 |
-- 查询包含周四的
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,所以能查出来