Php 在逗号分隔的数据库列中查找项
我正在为一个电子商务平台的搜索算法工作。该平台能够为不同的产品创建变体,并且产品的所有可用变体都包含在逗号分隔的列中。这是所有的田地Php 在逗号分隔的数据库列中查找项,php,mysql,sql,regex,database,Php,Mysql,Sql,Regex,Database,我正在为一个电子商务平台的搜索算法工作。该平台能够为不同的产品创建变体,并且产品的所有可用变体都包含在逗号分隔的列中。这是所有的田地 产品标识-例如1 变体组合-例如54,35,49(这些是用于不同变体的逗号分隔ID) 产品名称-如“Nike品牌T恤” 以下是我想要实现的目标,比如 从变量组合包含35、54和49的表中选择产品id 从变量组合包含35和54的表中选择产品id 从变体组合包含49的表中选择产品id 您可以使用LIKE关键字 SELECT product_id FROM table
产品标识
-例如1变体组合
-例如54,35,49(这些是用于不同变体的逗号分隔ID)产品名称
-如“Nike品牌T恤”从变量组合包含35、54和49的表中选择产品id
从变量组合包含35和54的表中选择产品id
从变体组合包含49的表中选择产品id
- 您可以使用LIKE关键字
SELECT product_id FROM table where variation_combo LIKE '%35%' AND LIKE '%54%' AND LIKE '%49%'
我希望这对您有所帮助您可以使用LIKE关键字
SELECT product_id FROM table where variation_combo LIKE '%35%' AND LIKE '%54%' AND LIKE '%49%'
我希望这会有所帮助我强烈建议重新设计列表值并将其移动到详细信息表中 但是,如果在字段设计中绝对绑定到列表,则可以使用
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'
我强烈建议重新设计列表值并将其移动到详细信息表中 但是,如果在字段设计中绝对绑定到列表,则可以使用
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'
请参阅:
从“在集合中查找”0和“变量组合”0的表中选择产品id
在_集合中查找_('54',变体_组合)0和在_集合中查找_('49',变体_组合)0
请参阅:
从“在集合中查找”0和“变量组合”0的表中选择产品id
在_集合中查找_('54',变体_组合)0和在_集合中查找_('49',变体_组合)0
如果变体组合的值为354
,该怎么办?我怀疑它是否应该被选中。好吧,我想了一下,但问题是,如果variation_combo包含154、135、145,那么即使不应该被选中,这个产品也会被选中。@DmitryEgorov,是的,同样的想法在插入这个组合时,如果你可以用方括号括住每个组合,比如[32],[40],因此,当searching@AlienWhale:然后在表示实际值时,是否要额外努力移除括号?这可不是个好办法。我建议使用RLIKE
。如果variation\u combo
的值为354
,该怎么办?我怀疑它是否应该被选中。好吧,我想了一下,但问题是,如果variation_combo包含154、135、145,那么即使不应该被选中,这个产品也会被选中。@DmitryEgorov,是的,同样的想法在插入这个组合时,如果你可以用方括号括住每个组合,比如[32],[40],因此,当searching@AlienWhale:然后在表示实际值时,是否要额外努力移除括号?这可不是个好办法。我建议使用RLIKE
。永远不要将数据存储为逗号分隔的值。这只会给你带来很多麻烦。有这样一个变体组合
是一个设计缺陷。考虑将列表值存储在详细表中。是的,我知道。但是我正在开发的软件有这个缺陷,现在改变它将非常困难。所以我们决定继续,永远不要将数据存储为逗号分隔的值。这只会给你带来很多麻烦。有这样一个变体组合
是一个设计缺陷。考虑将列表值存储在详细表中。是的,我知道。但是我正在开发的软件有这个缺陷,现在改变它将非常困难。所以我们决定继续,这甚至提供了优化的潜力。引用:“如果第一个参数是常量字符串,第二个参数是SET类型的列,那么FIND_IN_SET()函数将优化为使用位算术。”+1Thanks@DmitryEgorov,我非常喜欢你的解决方案,但我测试了性能,kapil的查询速度快了一点:)@omerFarooq:是的,同意,find_in_set
绝对适合您的情况。将我的答案留作记录:)这甚至提供了优化的潜力。引用:“如果第一个参数是常量字符串,第二个参数是SET类型的列,那么FIND_IN_SET()函数将优化为使用位算术。”+1Thanks@DmitryEgorov,我非常喜欢你的解决方案,但我测试了性能,kapil的查询速度快了一点:)@omerFarooq:是的,同意,find_in_set
绝对适合您的情况。把我的答案留作记录:)