根据应用的过滤器检索所有属性值

问题描述 投票:0回答:1

我正在尝试为网站实现动态产品过滤器,并且我需要编写一个数据库查询来根据应用的过滤器选择所有属性值。

表结构大致如下:

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),因此我希望这些值保留在结果集中。

如何修改此查询来实现此目的?

sql database postgresql filter
1个回答
0
投票

您应该为每组过滤器添加对值的检查。这意味着如果过滤器通过,那么您希望通过该过滤器进行过滤(如果不忽略过滤)。 另外,您也不需要子查询,如下所示:

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',)))
...
© www.soinside.com 2019 - 2024. All rights reserved.