1

我有一个名为的列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
4

2 回答 2

1

通常,您使用 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
于 2013-08-09T17:31:06.883 回答
1

根据MySQL 参考手册

“MySQL 以数字方式存储 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

于 2013-08-09T21:56:58.913 回答