【问题标题】:Find Items in a comma separated database column在逗号分隔的数据库列中查找项目
【发布时间】:2017-05-17 08:43:07
【问题描述】:

我正在研究电子商务平台的搜索算法。该平台能够为不同的产品创建变体,并且产品的所有可用变体都包含在逗号分隔的列中。这是所有字段。

  1. product_id - 例如 1
  2. variation_combo - 例如 54,35,49(这些是不同变体的逗号分隔 ID)
  3. product_name - 例如“耐克品牌 T 恤”

这是我想要实现的目标,例如

  • SELECT product_id FROM table where variation_combo contains 35 AND 54 AND 49
  • SELECT product_id FROM table where variation_combo contains 35 AND 54
  • SELECT product_id FROM table where variation_combo contains 49

【问题讨论】:

  • 永远不要将数据存储为逗号分隔值。只会给你带来很多麻烦。
  • 拥有这样的variation_combo 是一个设计缺陷。考虑将列表值存储在明细表中。
  • 是的,我知道这一点。但是我正在开发的软件有这个缺陷,现在改变它真的很难。所以我们决定继续前进。

标签: php mysql sql regex database


【解决方案1】:

参考这个: MySQL query finding values in a comma separated string

select product_id from table where find_in_set('35',variation_combo) <> 0   and 
find_in_set('54',variation_combo) <> 0 and find_in_set('49',variation_combo) <> 0

【讨论】:

  • 这甚至提供了优化的潜力。引用docs“如果第一个参数是常量字符串,第二个参数是 SET 类型的列,则 FIND_IN_SET() 函数被优化为使用位运算。” +1
  • 谢谢@DmitryEgorov,我真的很喜欢你的解决方案,但我测试了性能,kapil 的查询速度更快:)
  • @omerFarooq:是的,同意,find_in_set 绝对最适合您的情况。留下我的答案只是为了记录:)
【解决方案2】:

您可以使用 LIKE 关键字

SELECT product_id FROM table where variation_combo LIKE '%35%' AND LIKE '%54%' AND LIKE '%49%'

希望对你有帮助

【讨论】:

  • 如果variation_combo 的值为354 怎么办?我怀疑它应该被选中。
  • 我想到了,但问题是如果variation_combo 包含154、135、145,那么即使不应该选择该产品也会被选中。
  • @DmitryEgorov,是的,同样的想法
  • 在插入组合时,如果您可以用方括号将每个组合括起来会更有意义,例如 [32], [40] ,这样搜索时会更容易
  • @AlienWhale:然后在表示实际值的时候加倍努力去掉括号?几乎不是一个好方法。我建议使用RLIKE
【解决方案3】:

我强烈建议重新设计列表值并将其移动到明细表中。

但如果您在字段设计中绝对绑定到列表,您可以使用RLIKE 来检查列表中的值。如果 ID 只是字母数字(或者更准确地说不包含诸如 001-01 之类的单词边界),则任何单个 ID 都可以与 \bID\b 正则表达式匹配。所以你的陈述会变成

SELECT product_id
    FROM table 
    where variation_combo RLIKE '\\b35\\b'
        AND variation_combo RLIKE '\\b54\\b'
        AND variation_combo RLIKE '\\b49\\b'

SELECT product_id
    FROM table 
    where variation_combo RLIKE '\\b35\\b'
        AND variation_combo RLIKE '\\b54\\b'

SELECT product_id
    FROM table 
    where variation_combo RLIKE '\\b49\\b'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多