Php MySQL WHERE子句和分隔字符串存在问题

Php MySQL WHERE子句和分隔字符串存在问题,php,mysql,arrays,where-clause,Php,Mysql,Arrays,Where Clause,我有一个存储产品的数据库表。每个产品可以有多种颜色。每种颜色都由其ID表示,而不是像“红色”、“黄色”等文字描述。当$\u POST['COLOR']数组内爆为以逗号分隔的字符串时,它将存储在表中: product_id | colour ---------------------- 1 | 1,2 2 | 10 3 | 7,9 最近,我尝试创建一个搜索表单,可以选择多种颜色并搜索数据库表,以查看是否有任何产品在搜索数组中至少包含一种颜色。

我有一个存储产品的数据库表。每个产品可以有多种颜色。每种颜色都由其ID表示,而不是像“红色”、“黄色”等文字描述。当$\u POST['COLOR']数组内爆为以逗号分隔的字符串时,它将存储在表中:

product_id | colour
----------------------
1          | 1,2
2          | 10
3          | 7,9
最近,我尝试创建一个搜索表单,可以选择多种颜色并搜索数据库表,以查看是否有任何产品在搜索数组中至少包含一种颜色。因此,如果访问者想要查看颜色1和9的产品,我需要在“颜色”列中搜索这两个值

我不能在1,9中使用WHERE颜色,因为我认为只有当列中有一个值而不是多个值的分隔数组时,它才有效。我也不能使用WHERE color LIKE 1或WHERE color LIKE 9,因为它会返回颜色ID为10、11或12等的产品

有人知道我如何做到这一点吗?

此表需要规范化如果您想要获得良好的性能,请创建一个productColor表,该表与product表具有一对多关系

也就是说:

SELECT *
FROM Product
WHERE Colour LIKE '%,1,%' OR Colour LIKE '1,% OR COLOUR LIKE '%,1'
   OR Colour LIKE '%,9,%' OR Colour LIKE '9,% OR COLOUR LIKE '%,9'
此表需要规范化如果您想要获得良好的性能,请创建一个productColor表,该表与product表具有一对多关系

也就是说:

SELECT *
FROM Product
WHERE Colour LIKE '%,1,%' OR Colour LIKE '1,% OR COLOUR LIKE '%,1'
   OR Colour LIKE '%,9,%' OR Colour LIKE '9,% OR COLOUR LIKE '%,9'

为产品和颜色创建关联表,而不是在一列中存储多个值。与ASSOCPRODUCTS类似,带有col的productId和colorId包含一个Id col作为表的键

为产品和颜色创建一个关联表,而不是在一列中存储多个值。与ASSOCPRODUCTSCLORS一样,productId和colorId的col包含一个Id col作为表的键

与您已有的注释类似,我建议修改您的数据库,使其具有:

product_id | colour
----------------------
1          | 1
1          | 2
2          | 10
3          | 7
3          | 9
但是,您也可以使用,特别是RLIKE regex来实现这一点

SELECT *
FROM Product
WHERE Colour RLIKE '[[:<:]][19][[:>:]]'

正则表达式[[::]]表示匹配1或9[19],其中它是一个整词。[[::]]表示单词边界,因此,如果给定的模式本身是一个完整的单词,则仅与1或9匹配,如果它是另一个数字的一部分,则不匹配。

与您已有的注释类似,我建议修改您的数据库,使其具有:

product_id | colour
----------------------
1          | 1
1          | 2
2          | 10
3          | 7
3          | 9
但是,您也可以使用,特别是RLIKE regex来实现这一点

SELECT *
FROM Product
WHERE Colour RLIKE '[[:<:]][19][[:>:]]'
正则表达式[[::]]表示匹配1或9[19],其中它是一个整词。[[::]]表示单词边界,因此,如果给定的模式本身是一个完整的单词,则仅与1或9匹配,如果它是另一个数字的一部分,则不匹配。

规范化该表

同时,您可以使用:

SELECT *
FROM Product
WHERE FIND_IN_SET( 1, Colour )
   OR FIND_IN_SET( 9, Colour )           --- etc
使表正常化

同时,您可以使用:

SELECT *
FROM Product
WHERE FIND_IN_SET( 1, Colour )
   OR FIND_IN_SET( 9, Colour )           --- etc

您的颜色栏定义可能重复?@Wrikken-该解决方案非常完美,谢谢。@AdrianCornish您所说的“定义”是什么意思?您的颜色栏定义可能重复?@Wrikken-该解决方案非常完美,谢谢。@AdrianCornish你所说的“定义”是什么意思?+1只是强调了这个表确实需要规范化的一点。谢谢-我现在规范了这个表并重构了我的代码:+1只是强调了这个表确实需要规范化的一点。谢谢-我现在规范了这个表并重构了我的代码: