我正在尝试添加从具有基本实体 - 属性 - 值模型的数据库中获取产品时添加多个过滤器的可能性 . 过滤器基于属性值,如:
-
颜色:绿色,红色
-
尺寸:小,大
我对单个过滤器没有任何问题,但我不知道如何一次接近多个过滤器 .
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 回答
我能够通过以下查询使其工作 in a way :
我说 in a way 因为它将返回 variants 的 one or more 中具有每个请求属性的所有产品 .
Example :
拿一件单品,一件有两种颜色和两种尺码的衬衫,它的变种可以是:
衬衫(绿色和小)
衬衫(绿色和大号)
衬衫(红色和小号)
注意没有红色和大型变体 . 如果我使用red和large执行上述查询,它仍会匹配此产品,因为其中一个变体为“red”而另一个变量为“large” .
我决定将此作为答案而不是编辑添加,因为它实现了将产品与两个(或更多)属性匹配的目标,但我仍然希望看到一个答案,其结果被限制为匹配单个变体的产品,或者也许是实现这一目标的另一种方式