0

我有在 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" WHERE ("PriceTax" >= '100' AND "PriceTax" <= '200') AND ("AttributeValueID" IN ('9 ','8','7')) AND ("AttributeValueID" IN ('5','4'))

预先感谢您的帮助

4

2 回答 2

4

这是“set-within-sets”查询的一个示例。group by我喜欢使用and来解决这些问题having,因为这是一种非常灵活的方法:

select pa.ProductId
from ProductAttributes pa
group by pa.ProductId
having sum(AttributeValueId = 9) > 0 and
       sum(AttributeValueId = 16) > 0;
于 2014-04-21T16:34:10.477 回答
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'
于 2014-04-21T16:43:38.497 回答