给出下表(products_filter):
如何以这样的方式执行SELECT ... FROM products LEFT JOIN products_filter ...
,它只返回具有所有指定(filter_id,filter_value)对的产品。
示例:for(filter_id,filter_value)=(1,1),(3,0)它应该只返回标识为90001
的产品,因为它匹配这两个值。
答案 0 :(得分:1)
如果指定的过滤器对被限制为deifnite编号,则以下查询应该有效。
Select a. Product_id
From products a
Left outer join
(Select product_id,filter_id,filter_value,count(*)
From product_filter
Where filter_id in (1,1) and filter_value in(3,0)
Group by product_id,filter_id,filter_value
Having count(*)=2)b
On(a.product_id=b.product_id)
答案 1 :(得分:1)
正如您所说的那样,您希望产品值具有所需的过滤器属性......我的结果仅限于产品。*
以下查询使用带有产品ID的不同过滤器数量的内联视图。然后,外部where子句使用filter_IDs的非重复计数(如果产品可能存在重复过滤器)。
where子句中的#应始终与内联视图中where子句配对集的数量相匹配。
您的示例数据表明配对集可能是所有过滤器的子集。这样可确保所需产品的每个过滤器对(或更多)都存在。
SELECT p.*
FROM products p
LEFT JOIN (SELECT product_ID, count(Distinct filter_ID) cnt
FROM products_Filter
WHERE (Filter_ID = 1 and filter_value = 1)
or (Filter_ID = 3 and filter_value = 0)
GROUP BY Product_ID) pf
on P.Product_ID = PF.Product_ID
WHERE pf.cnt = 2