【问题标题】:search comma separated values from column contains comma separated string mysql从列中搜索逗号分隔的值包含逗号分隔的字符串mysql
【发布时间】:2019-06-18 17:08:03
【问题描述】:

我正在尝试从包含逗号分隔字符串的数据库表列中搜索逗号分隔值。

MY DB

id    interest    status
------------------------
1      1,2,3        1
2        4          1

我的搜索组合包含1,23,231,4 等。任何组合都会出现。

我想显示所有id,其中包含逗号分隔的搜索组合中的任何数字。

例如,搜索1,4 应该返回

id
--
1
2

例如,搜索3,2 应该返回

id
--
1

我尝试过使用INFIND_IN_SET,但它们都没有达到我的效果。有没有其他选择。

SELECT * FROM `tbl_test` WHERE interest IN (3)

以上代码返回空集。

【问题讨论】:

  • 不要将值存储为 csv。规范化你的数据库。
  • FIND_IN_SET 帮助您只搜索给定集合中的一个元素,因此搜索多个元素(如“1,2”)将使用 AND 运算符链接。当您必须查找超过 2 个元素时,它可能会变得混乱

标签: mysql


【解决方案1】:

就像 Jens 在 cmets 中指出的那样,强烈建议标准化您的架构。

如果您希望继续使用字符串和逗号分隔值,那么您应该查看复杂的正则表达式匹配(我留给您探索)。

但是,另一种选择是将您的列 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.看到它的动作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多