MySQL LEFT JOIN其中有多个值

时间:2014-04-21 16:31:32

标签: mysql sql left-join where multiple-value

我有在Product_Attributes表上连接Products表的查询。我'我希望得到的产品具有良好的条件。

选择了属性ID为9和16的产品,但是当我运行此查询时,我只会获得符合第一个ID的产品

WHERE ("AttributeValueID" = 9 AND "AttributeValueID" = 16)

我需要这些产品同时选择两个属性AttributeValueID = 9 AND AttributeValueID = 9 not only this or that attribute ID.使用OR / IN对我来说不是解决方案。

更新

下面的

是查询的一部分,其中包含join / where:

LEFT JOIN" Product_Attributes" ON" Product_Attributes"。" ProductID" =" SiteTree_Live"。" ID"在哪里(" PriceTax"> =' 100' AND" PriceTax"< =' 200')AND(" AttributeValueID&# 34; IN(' 9',' 8',' 7'))和(" AttributeValueID" IN(' 5&#) 39;,' 4'))

提前感谢您的帮助

2 个答案:

答案 0 :(得分:4)

这是“set-within-sets”查询的示例。我想使用group byhaving解决这些问题,因为这是一种非常灵活的方法:

select pa.ProductId
from ProductAttributes pa
group by pa.ProductId
having sum(AttributeValueId = 9) > 0 and
       sum(AttributeValueId = 16) > 0;

答案 1 :(得分:0)

Gordon的回答显示了获得符合指定条件的ProductId值列表的最灵活方式。

您可以使用像Gordon这样的查询(获取ProductId的集合)作为内联视图,并对products表执行JOIN操作,如下所示:

SELECT p.ProductID
     , p.ProductName
     , ...
  FROM products p
  JOIN ( 
         SELECT a.ProductID
           FROM ProductAttributes a
          GROUP BY a.ProductId
         HAVING SUM(a.AttributeValueID=9) > 0
            AND SUM(a.AttributeValueID=16) > 0
       ) s
     ON s.ProductID = p.ProductID

<强>更新

基于对添加SQL文本片段的问题的编辑:

JOIN ( SELECT a.ProductID
         FROM Product_Attributes a
        HAVING SUM(a.AttributeValueID IN ('9','8','7')) > 0
           AND SUM(a.AttributeValueID IN ('5','4')) > 0
         GROUP BY a.ProductID
     ) s
   ON s.ProductID = SiteTree_Live.ID
WHERE SiteTree_Live.PriceTax >= '100'
  AND SiteTree_Live.PriceTax <= '200'