[英]Fetching products matching multiple attribute filters (entity attribute value)
我试图增加从具有基本实体-属性-值模型的数据库中获取产品时添加多个过滤器的可能性。 过滤器基于以下属性值:
单个过滤器没有问题,但是我不知道如何一次处理多个过滤器。
示例数据 :(精简版)
餐桌产品 :
id name
1 jacket
2 shirt
表product_variants :
id product_id
1 1
2 2
3 2
表属性 :
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)
对于此示例,三个变体将是:
目标 :
我想传递属性值的ID并获取与所有所述属性值匹配的产品,例如:
products.php?attr=1&4
应该获取green(1)和large(4)的产品,例如,只有第三个变体符合条件,因此所需结果将是:
product_id product_desc
2 shirt
我尝试过的是 :
我认为不会有太大帮助,但是我有一个属性:
products.php?attr=1
应该产生具有属性值绿色(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
例如,我不知道如何过滤具有绿色和大值列的行。 我认为我为查询采用的方法是错误的。
任何帮助,将不胜感激。
我可以通过以下查询以某种方式使其工作:
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
)
我这样说是因为它将返回在一个或多个 变体中具有每个请求属性的所有产品。
范例 :
以单一产品为例,它有两种颜色和两种尺寸的衬衫,其变化形式可能是:
请注意,没有红色和较大的变体。 如果我对红色和大号进行上述查询,它仍将与该产品匹配,因为其变体之一为“红色”,另一个为“大”。
我决定将其添加为答案而不是进行编辑,因为它实现了将产品与两个(或多个)属性进行匹配的目标,但我仍然希望看到一个答案,其结果被限制为只能匹配一个变体。产品,或实现此目的的另一种方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.