首页 文章

获取与多个属性过滤器匹配的产品(实体属性值)

提问于
浏览
1

我正在尝试添加从具有基本实体 - 属性 - 值模型的数据库中获取产品时添加多个过滤器的可能性 . 过滤器基于属性值,如:

  • 颜色:绿色,红色

  • 尺寸:小,大

我对单个过滤器没有任何问题,但我不知道如何一次接近多个过滤器 .


EXAMPLE DATA :(缩减版)

SQL file with this example structure & data

products

id name
1  jacket
2  shirt

product_variants

id product_id
1  1
2  2
3  2

attributes

id name
1  colors
2  sizes

attribute_value

id attribute_id value
1  1            green
2  1            red
3  2            small
4  2            large

variant_details

id product_variant_id attribute_value_id
1  1                  3                    (jacket - small)
2  2                  1                    (shirt - green)
3  2                  3                    (shirt - small)
4  3                  1                    (shirt - green)
5  3                  4                    (shirt - large)

对于此示例,三个变体将是:

  • 夹克(小)

  • 衬衫(绿色和小号)

  • 衬衫(绿色和大号)


THE GOAL

我想传递属性值的ID并获得与所有属性值匹配的产品,例如:

products.php?attr=1&4

应该获取绿色(1)和大(4)的产品,例如,只有第三个变量符合条件,因此所需的结果将是:

product_id product_desc
2          shirt

WHAT I'VE TRIED

我不认为它会有多大帮助,但我有一个属性:

products.php?attr=1

应该产生属性值为green(1)的任何东西:

SELECT products.id, products.desc, attribute_value.value FROM products
LEFT JOIN product_variants ON products.id = product_variants.product_id
LEFT JOIN variant_details ON variant_details.product_variant_id = product_variants.id
LEFT JOIN attribute_value ON attribute_value.id = variant_details.attribute_value_id
WHERE attribute_value.id = 1
GROUP BY products.id

这个问题是,在 WHERE 子句之前,这是它产生的:

id name    value
1  jacket  small
2  shirt   green
2  shirt   small
2  shirt   green
2  shirt   large

我不知道如何过滤那些绿色和大的值列的行 . 我在想我正在为查询采取的方法是错误的 .

任何帮助,将不胜感激 .

1 回答

  • 0

    我能够通过以下查询使其工作 in a way

    SELECT products.id, products.desc FROM products
    WHERE EXISTS 
    (
    SELECT * FROM product_variants
    LEFT JOIN variant_details ON variant_details.product_variant_id = product_variants.id
    LEFT JOIN attribute_value ON attribute_value.id = variant_details.attribute_value_id
    WHERE product_variants.product_id = products.id AND attribute_value.id = 1
    )
    AND EXISTS
    (
    SELECT * FROM product_variants
    LEFT JOIN variant_details ON variant_details.product_variant_id = product_variants.id
    LEFT JOIN attribute_value ON attribute_value.id = variant_details.attribute_value_id
    WHERE product_variants.product_id = products.id AND attribute_value.id = 4
    )
    

    我说 in a way 因为它将返回 variantsone or more 中具有每个请求属性的所有产品 .

    Example

    拿一件单品,一件有两种颜色和两种尺码的衬衫,它的变种可以是:

    • 衬衫(绿色和小)

    • 衬衫(绿色和大号)

    • 衬衫(红色和小号)

    注意没有红色和大型变体 . 如果我使用red和large执行上述查询,它仍会匹配此产品,因为其中一个变体为“red”而另一个变量为“large” .

    我决定将此作为答案而不是编辑添加,因为它实现了将产品与两个(或更多)属性匹配的目标,但我仍然希望看到一个答案,其结果被限制为匹配单个变体的产品,或者也许是实现这一目标的另一种方式

相关问题