这是我的产品表
我想获得product_size为(Xl,M)的所有产品
我正在尝试这段代码
SELECT `id`,`name`,`sell_price`,`product_sizes`,`product_colors`
FROM `view_product_listing`
WHERE `product_sizes` in ('XL', 'M')
返回我的productId 15和16,但我想输入productId 4,14,15,16
答案 0 :(得分:2)
您应该认真避免将大小存储为CSV(逗号分隔)数据,请参见下面的替代表格设计。解决方法是,我们可以使用FIND_IN_SET
:
SELECT id, name, sell_price, product_sizes, product_colors
FROM view_product_listing
WHERE FIND_IN_SET('M', product_sizes) > 0 OR FIND_IN_SET('XL', product_sizes) > 0;
但是请注意,更好的数据库设计是针对产品,尺寸和颜色使用单独的表格:(省略颜色)
products
id | name | sell_price |
4 | Women Maxi White Dress | 550.00 |
14 | Women Maxi Blue Dress | 700.00 |
15 | Women Fit and Flare Multicolor Dress | 750.00 |
16 | Floral Print Straight Kurta | 699.00 |
sizes
product_id | product_size
4 | XL
4 | M
14 | XL
14 | XXL
14 | L
14 | M
15 | XL
16 | M
现在,我们可以使用直接联接来查找所有具有中等或XL尺寸的产品及其元数据:
SELECT
p.id,
p.name,
p.sell_price,
s.product_size
FROM products p
INNER JOIN sizes s
ON p.id = s.product_id
WHERE
s.product_size IN ('M', 'XL');
答案 1 :(得分:1)
您可以像这样使用FIND_IN_SET
版本1:
SELECT `id`,`name`,`sell_price`,`product_sizes`,`product_colors`
FROM `view_product_listing`
WHERE FIND_IN_SET('XL',product_sizes) OR FIND_IN_SET('M',product_sizes)
编辑1
还有另一种方法可以实现这一目标,
版本2:
SELECT `id`,`name`,`sell_price`,`product_sizes`,`product_colors`
FROM `view_product_listing`
WHERE CONCAT(',',product_sizes,',') REGEXP ",(XL|M),"
第二个version的源链接。
编辑2
您product_sizes
的逗号后面有空格,这不是find_in_set所期望的行为。要修剪该列中的所有空格,
UPDATE `table` SET `product_sizes` = REPLACE(`product_sizes`, ' ', '')
现在运行您要尝试的任何版本查询,它将起作用。
答案 2 :(得分:1)
使用find_in_set()
SELECT `id`,`name`,`sell_price`,`product_sizes`,`product_colors`
FROM `view_product_listing`
WHERE FIND_IN_SET(product_sizes,'XL,M')
答案 3 :(得分:1)
如果仅搜索一种尺寸,则可以使用内置的MySQL函数FIND_IN_SET()
SELECT `id`,`name`,`sell_price`,`product_sizes`,`product_colors`
FROM `view_product_listing`
WHERE FIND_IN_SET('XL', product_sizes)
但是,它仅支持单个字符串(除非您添加其他OR
,但是很快就会变得乏味)。
最好的方法是重组数据库,以使商品的产品尺寸在单独的表中,并引用商品表和尺寸表。
这样,您不必每次要引入新大小时都更新查询,这将提高查询的性能。
警告语
请勿尝试使用LIKE
子句,因为搜索LIKE '%XL%'
也会匹配XXL