【问题标题】:Complex Select with 3 Tables具有 3 个表的复杂选择
【发布时间】: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


【解决方案1】:

您可以使用子查询:

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 而不是所有内容。这样,无论该查询多么复杂(您在 cmets 中提到了数百个属性),您始终可以使用这样的语句包装该逻辑,并从该特定子集中提取一些唯一值。

【讨论】:

  • 万佳,非常感谢!我真的很感谢你的帮助。我已经在努力在生产代码中实现您的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多