具有 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
结果我得到了这个包含所有属性及其不同值的数组:
尺码:
- XL
- L
- S
颜色:
- 红色
- 绿色
- 黑色
比方说,用户通过 属性 '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 而不是所有内容。这样,无论该查询多么复杂(您在评论中提到了数百个属性),您始终可以使用这样的语句包装该逻辑并从该特定子集中提取一些唯一值。
我正在开发电子商务应用程序,我正在努力选择产品属性以将其用作过滤器。
有 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
结果我得到了这个包含所有属性及其不同值的数组:
尺码:
- XL
- L
- S
颜色:
- 红色
- 绿色
- 黑色
比方说,用户通过 属性 '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 而不是所有内容。这样,无论该查询多么复杂(您在评论中提到了数百个属性),您始终可以使用这样的语句包装该逻辑并从该特定子集中提取一些唯一值。