我正在尝试为网站实现动态产品过滤器,并且我需要编写一个数据库查询来根据应用的过滤器选择所有属性值。
表结构大致如下:
Product:
id,
...
Attribute:
id,
name
ProductAttribute:
id,
product_id,
attribute_id,
value
我编写了一个查询,用于检索当前产品集的所有属性值:
SELECT DISTINCT a.name, pa.value
FROM product_attribute pa
JOIN attribute a ON a.id = pa.attribute_id
WHERE pa.product_id IN (
SELECT p.id
FROM products_product p
WHERE (
EXISTS (
SELECT 1 FROM product_attribute
JOIN attribute ON attribute.id = product_attribute.attribute_id
WHERE product_id = p.id AND (
attribute.name = 'attribute1' AND value IN ('value1',)
)
)
AND EXISTS (
SELECT 1 FROM product_attribute
JOIN attribute ON attribute.id = product_attribute.attribute_id
WHERE product_id = p.id AND (
attribute.name = 'attribute2' AND value IN ('value2',)
)
)
)
);
此查询的问题在于,当应用一个属性值时,该属性的所有其他值都会被排除。但是,我需要过滤器允许同时过滤多个属性值(例如,attribute2:value2,value3),因此我希望这些值保留在结果集中。
如何修改此查询来实现此目的?
您应该为每组过滤器添加对值的检查。这意味着如果过滤器通过,那么您希望通过该过滤器进行过滤(如果不忽略过滤)。 另外,您也不需要子查询,如下所示:
SELECT DISTINCT a.name, pa.value
FROM product_attribute pa
JOIN attribute a ON a.id = pa.attribute_id
WHERE (('value1') is null or (A.name = 'attribute1' AND PA.value IN ('value1',)))
and (('value2') is null or (A.name = 'attribute3' AND PA.value IN ('value2',)))
and (('value3') is null or (A.name = 'attribute3' AND PA.value IN ('value3',)))
...