我正在尝试从包含逗号分隔字符串的数据库表列中搜索逗号分隔值。
MY DB
id interest status
------------------------
1 1,2,3 1
2 4 1
我的搜索组合包含1,2
,3,2
,3
,1,4
等。任何组合都会发生。
我想显示所有id
,其中包含逗号分隔的搜索组合中的任何数字。
例如,搜索1,4
应该返回
id
--
1
2
例如,搜索3,2
应该返回
id
--
1
我尝试使用IN
和FIND_IN_SET
,但都没有达到我的结果。还有其他选择吗?
SELECT * FROM `tbl_test` WHERE interest IN (3)
上面的代码返回空集。
答案 0 :(得分:1)
就像Jens在评论中指出的那样,强烈建议您强烈规范化您的架构。
如果您希望继续使用字符串和逗号分隔的值,则应查看 复杂的正则表达式匹配 (我留给您研究)。 / p>
不过,另一种替代方法是将列interest
转换为 JSON 数据类型。 MYSQL 5.7 及更高版本支持这些数据类型。
CREATE TABLE IF NOT EXISTS `tbl` (
`id` int(6) unsigned NOT NULL,
`interest` JSON DEFAULT NULL,
`status` int(1) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `tbl` (`id`, `interest`,`status`) VALUES
(1, '[1,2,3,4]',1),
(2, '[1,2]',1),
(3, '[3]',1);
然后查询如下:
select id from tbl where JSON_CONTAINS( interest ,'[1,2]')
select id from tbl where JSON_CONTAINS( interest ,'[3,4]');
...
您可以在this sql fiddle.
中看到它的操作