MySQL中位操作实现多属性过滤的问题求助
如何用MySQL位操作筛选包含指定所有属性的记录
正确的查询语句如下,它能匹配所有包含筛选器1、2、4对应属性的记录(包括值为11和15的情况):
SELECT * FROM table WHERE (filter & (1 | 2 | 8)) = (1 | 2 | 8);
逻辑说明:
- 先计算目标掩码:
1 | 2 | 8的结果是11(二进制1011),代表你需要确保存在的三个属性位。 filter & 11会提取filter中与掩码重叠的位:- 当
filter是11(仅包含指定三个属性),运算结果等于11,符合条件; - 当
filter是15(包含所有四个属性),运算结果同样等于11,符合条件; - 若
filter仅包含部分指定属性(比如值为3,只包含筛选器1和2),运算结果是3,不等于11,会被排除。
- 当
你之前的两种写法问题:
filter = 1|2|8:仅匹配刚好只有这三个属性的记录,多出来的属性(比如筛选器3)会导致不匹配;filter & (1|2|8):只要filter包含任意一个指定属性,该表达式就返回非0值(MySQL将非0视为真),会把只满足部分条件的记录也查询出来。
也可以直接使用掩码的数值结果简化语句,效果完全一致:
SELECT * FROM table WHERE (filter & 11) = 11;
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

