【问题标题】:MySQL searching from comma separated stringMySQL 从逗号分隔的字符串中搜索
【发布时间】:2015-01-31 16:01:46
【问题描述】:

我有这个表这样的结构。

          ID                           Category            Publisher

           1                             1,2                  A
           2                             1                    B
           3                             2                    C
           4                             1                    D
           5                             2                    E
           6                             2,3,1                F

我想要一个查询,当我搜索 1,3 的类别时,它会返回 关注

我试过了,但没有得到任何优化的方法。

          ID                           Category            Publisher

           1                             1,2                  A
           2                             1                    B
           4                             1                    D
           6                             2,3,1                F

【问题讨论】:

  • 修复您的数据结构,以便使用联结表。 SQL 具有用于存储列表的出色数据结构。它被称为“表”而不是“字符串”。

标签: mysql sql


【解决方案1】:
select * from your_table
where find_in_set(1, category) > 0
or find_in_set(3, category) > 0

但实际上,您永远不应该在单个列中存储多个值。更好地改变你的桌子设计。

【讨论】:

  • 嘿,我不想传递单个时间值 (1,3)。那么请做相应的事情
【解决方案2】:

虽然纯 SQL 不提供在两组之间进行比较的工具,但这可以通过代码 (JavaScript/PHP) 或使用存储过程来实现。

为了使用纯 SQL,您可以实现一个存储过程,以将逗号分隔的字符串作为单列临时表返回(this answerthis post 可以为您提供实现这部分的想法)。

然后,利用您创建的内容,假设功能已实现 STR_SPLIT(<string>, <delimiter>) 并返回一个包含名为 colName 的单列的表,您可以这样写:

SELECT DISTINCT `tblName`.*
FROM `tblName`
INNER JOIN STR_SPLIT('1,3',',') `given`
   ON FIND_IN_SET(`given`.`colName`, `category`) > 0

这将获取每个值并单独匹配它,这将创建将被 DISTINCT 语句消除的重复项,这使得这不是理想的解决方案。

我建议在这种数据情况下使用参考表,这将使处理这个问题变得轻而易举,或者实施部分解决方案并完成代码端。

【讨论】:

  • 无法联系到您。如果可以,请提供 sql fiddle 解决方案。
  • 实现一个 STR_SPLIT 函数,然后这个查询将为您解决问题。再说一次,这是一个简单问题的复杂解决方案。如果您仍然能够引入架构更改,请执行此操作。
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多