【问题标题】:How to get record where find_in_set from a comma saperate string.[MySql]如何从逗号分隔的字符串中获取 find_in_set 的记录。[MySql]
【发布时间】:2018-09-25 08:34:27
【问题描述】:

我有一个逗号分隔的字符串,如“1,2,3”,表中的一列也包含逗号分隔的值,如“1,2,4,5,3”如何获取与任何值匹配的所有记录任何值。

例如

  • id---类别
  • 1---1,2,4,5
  • 2---1,2,3,6
  • 3---2,3,5

如果我搜索字符串“1,2,3”,那么我应该记录包含 1 或 2 或 3 或 1,2 或 1,3 或 2,3 或 1,2,3 的类别。它不应该返回重复的值,因为我们可以将它们分组。

是否可以通过单个查询获取所有记录。

【问题讨论】:

  • 最好的方法是规范化列类别
  • 修复你的数据模型!不要将列表存储在字符串中,尤其是数字列表!

标签: mysql sql database


【解决方案1】:

试试这个:

select * from table where category IN (1,2,3);

【讨论】:

  • 执行查询:create table Test(id integer, title varchar(100));插入 Test(id, title) values(1, "1,2,3");插入 Test(id, title) 值(2, "1,4,5");插入 Test(id, title) values(3, "4,5"); select * from Test where title IN (1,2);
  • 请以权威的方式回答——“试试这个”意味着可能会反复寻找答案。 SO 不是论坛。
【解决方案2】:

您不应该将 id 列表存储在字符串中。原因如下:

  • 应使用正确的类型存储值。 int 字符串。
  • SQL 具有糟糕的字符串处理功能。
  • 应正确声明外键。
  • SQL 将无法优化这些查询。
  • SQL 有一种存储列表的好方法。它被称为 table 而不是 string

但是,有时您会被其他人困在非常、非常、非常、非常、非常糟糕的数据建模决策上。你可以做一些事情,使用正则表达式:

where category regexp replace($string, ',', '|')

或者更准确地说:

where concat(',', category, ',') regexp concat(',', replace($string, ',', ',|,'), ',')

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 2016-12-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2014-03-22
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多