如何从MySQL表正确获取结果

时间:2019-04-18 07:43:02

标签: php mysql

这是我的产品表

enter image description here

我想获得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

4 个答案:

答案 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