【发布时间】:2021-03-26 07:14:28
【问题描述】:
我正在开发电子商务应用程序,我正在努力选择产品属性以将它们用作过滤器。
有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
颜色:
- 红色
- 绿色
- 黑色
假设用户按属性“颜色”=“黑色”或“颜色”=“红色”过滤产品
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
因此,我们得到了 XL 和 L 尺寸的 2 件产品。 由于没有 S 码的产品,如何更新尺码列表以仅显示 XL 和 L 码?
SELECT * FROM propertyvalue
?????
WHERE propertyvalue.property = 2
我使用 PHP 作为后端。很高兴回答任何其他问题。帮助。
【问题讨论】:
-
DISTINCT 不是函数,它是 SELECT DISTINCT 的一部分。只需写
SELECT DISTINCT value FROM ...让代码更清晰。 -
您已经有一个具有不同大小的查询。似乎您只需要对其进行扩展即可使用与过滤查询相同的条件。
-
或者,如果您不想运行另一个查询,您可以在 PHP 中迭代过滤结果时创建一个唯一大小的数组。
-
@El_Vanja 我正在努力掌握该查询的外观。我没有遍历所有结果,LIMIT 设置为 15
-
你能发布下查询的实际输出吗?描述性句子与数据和查询不匹配。
标签: php sql filter e-commerce product