Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在逗号分隔的数据库列中查找项_Php_Mysql_Sql_Regex_Database - Fatal编程技术网

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
        绝对适合您的情况。把我的答案留作记录:)