MySQL左连接多个列对

时间:2016-01-25 18:04:02

标签: mysql join

给出下表(products_filter):

enter image description here

如何以这样的方式执行SELECT ... FROM products LEFT JOIN products_filter ...,它只返回具有所有指定(filter_id,filter_value)对的产品。

示例:for(filter_id,filter_value)=(1,1),(3,0)它应该只返回标识为90001的产品,因为它匹配这两个值。

2 个答案:

答案 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