[英]MySQL Select any SET using IN()?
我有一个名为post_type
set('0', '1', '2', '3', '4')
,可以是0到4的任意组合
给定一个整数列表,我如何选择与任何类型匹配的任何行? 我的脑袋大便,我什至无法正确解释,但类似于:
SELECT * FROM `post_content` WHERE `post_type` IN ('0','1','2');
因此,通过以下设置,它将匹配除最后一个记录以外的所有记录
post_type
0,1,3 (matches 0 and 1)
0,3,4 (matches 0)
0,4 (matches 0)
2,3,4 (matches 2)
3,4 (not matched)
非常感谢
编辑:我了解FIND_IN_SET
但我试图避免:
SELECT * FROM tbl_name WHERE
FIND_IN_SET(0,post_type)>0 ||
FIND_IN_SET(1,post_type)>0 ||
FIND_IN_SET(2,post_type)>0
通常,您使用FIND_IN_SET()函数或LIKE运算符搜索SET值:
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
资料来源: http : //dev.mysql.com/doc/refman/5.0/en/set.html
因此,在您的示例中,将是:
SELECT * FROM post_content
WHERE FIND_IN_SET(0,post_type)>0
OR FIND_IN_SET(1,post_type)>0
OR FIND_IN_SET(2,post_type)>0
根据MySQL参考手册 :
“ MySQL以数字方式存储SET值,存储值的低位对应于第一个set成员。如果在数字上下文中检索SET值,则检索到的值具有与构成set成员的set成员相对应的位set列值。”
因此,您可以使用位运算来执行设置算术: &
对应于设置交集,而|
对应于工会。
唯一的问题是,您需要根据列定义自己计算查询中可能需要的任何常量位掩码; 据我所知,MySQL没有提供方便的语法来将SET
列值的字符串表示形式转换为相应的数字位掩码,除非将其分配给该列。
例如,在上面的示例中,集合0,1,2
将对应于位掩码1 + 2 + 4 =7。因此,您可以通过查询有效地检索集合中包含这些值之一的任何行:
SELECT * FROM post_content WHERE post_type & (1 + 2 + 4);
这是此查询的实时演示: http : //sqlize.com/wE4je6f28Y
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.