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

hfyxw5xn  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(343)

我正在尝试添加从具有基本实体属性值模型的数据库获取产品时添加多个过滤器的可能性。过滤器基于属性值,如:
颜色:绿色,红色
尺寸:小,大
我对单个过滤器没有问题,但我不知道如何一次处理多个过滤器。
示例数据:(简化版)
具有此示例结构和数据的sql文件
餐桌产品:

id name
1  jacket
2  shirt

表产品类型:

id product_id
1  1
2  2
3  2

表属性:

id name
1  colors
2  sizes

表属性值:

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

表格变量详细信息:

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

应该获取绿色(1)和大型(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

例如,我不知道如何过滤那些值列为green和large的行。我认为我对这个问题采取的方法是错误的。
任何帮助都将不胜感激。

sdnqo3pr

sdnqo3pr1#

我可以通过以下查询使其工作:

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
)

我之所以这么说,是因为它将返回在一个或多个变体中具有每个请求属性的所有产品。
例子:
以单一产品为例,一件衬衫有两种颜色和两种尺寸,其变体可能是:
衬衫(绿色和小号)
衬衫(绿色和大号)
衬衫(红色和小号)
注意没有红色和大的变体。如果我用red&large进行上述查询,它仍然会匹配此产品,因为它的一个变体有“red”,另一个变体有“large”。
我决定把它作为一个答案而不是一个编辑,因为它实现了用两个(或更多)属性匹配一个产品的目标,但我仍然希望看到一个答案,其中结果被限制为匹配该产品的一个变体,或者是另一种方法来实现这一点。

相关问题