具有 3 个表的复杂 Select

Complex Select with 3 Tables

我正在开发电子商务应用程序,我正在努力选择产品属性以将其用作过滤器。

有 3 个表:

产品

id name active
1 Balloon XL Red 1
2 Balloon L Red 1
3 Balloon XL Green 1
4 Balloon S Green 1
5 Balloon XL Black 1

属性

id name
1 Color
2 Size

属性值

id property product value
1 1 1 Red
2 2 1 XL
3 1 2 Red
4 2 2 L
5 1 3 Green
6 2 3 XL
7 1 4 Green
8 2 4 S
9 1 5 Black
10 2 5 XL

演示可在 SqlFiddle

上获得

首先,我创建了一个包含所有可用属性的数组,让用户筛选产品。

SELECT * FROM property

然后我得到每个属性的不同值

SELECT DISTINCT value FROM propertyvalue
WHERE property = 1

结果我得到了这个包含所有属性及其不同值的数组:

尺码:

颜色:

比方说,用户通过 属性 'Color' = 'Black' 或 'Color' = 'Red'

筛选产品
SELECT * FROM product
INNER JOIN propertyvalue
ON product.id = propertyvalue.product
WHERE
    (
        propertyvalue.value = 'Black' AND propertyvalue.property = 1
        OR
        propertyvalue.value = 'Red' AND propertyvalue.property = 1
    )
    AND product.active = 1

因此,我们得到了 2 件 XL 和 L 尺寸的产品。 由于没有 S 尺码的产品,我该如何更新尺码列表以仅显示 XL 和 L 尺码?

SELECT * FROM propertyvalue
?????
WHERE propertyvalue.property = 2

我正在使用 PHP 作为后端。很高兴回答任何其他问题。帮助。

您可以使用子查询:

SELECT DISTINCT pv.value FROM propertyvalue pv
INNER JOIN product p ON p.id = pv.product
WHERE pv.property = 2 AND p.id IN (
    SELECT product.id FROM product
    INNER JOIN propertyvalue
    ON product.id = propertyvalue.product
    WHERE
    (
        propertyvalue.value = 'Black' AND propertyvalue.property = 1
        OR
        propertyvalue.value = 'Red' AND propertyvalue.property = 1
    )
    AND product.active = 1
)

基本上,子查询与您的产品过滤查询相同,唯一的区别是它只选择产品 ID 而不是所有内容。这样,无论该查询多么复杂(您在评论中提到了数百个属性),您始终可以使用这样的语句包装该逻辑并从该特定子集中提取一些唯一值。