条件不受尊重

时间:2017-03-23 17:19:57

标签: mysql sql where

目前我正在使用AdventureWorks数据库并玩弄一些查询。我试图解决以下练习:

按产品ID订购所有产品,

  • 至少收到一次价格修改
  • 颜色为'黄色''蓝色''黑色'
  • 列于'头盔''手套'类别

这是我的疑问:

SELECT pp.ProductID, pp.Name, pps.Name FROM Production.Product pp

JOIN Production.ProductCostHistory ppch
ON pp.ProductID = ppch.ProductID

JOIN Production.ProductSubcategory pps
ON pps.ProductSubcategoryID = pp.ProductSubcategoryID

WHERE pps.Name LIKE 'Helmets' OR pps.Name LIKE 'Gloves'
    AND pp.Color LIKE 'Yellow' OR pp.Color LIKE 'Blue' OR pp.Color LIKE 'Black'

GROUP BY pp.ProductID, pp.Name, pps.Name
HAVING Count(ppch.ModifiedDate) > 1
ORDER BY pp.Name ASC

这是我的结果:

enter image description here

现在,提出我的问题。尽管我用'AND'连接了两个条件但我收到了其他两个类别的结果,这些类别被进一步列出了匹配的颜色('Road Frames'& 'Road Bikes' )我并不安静地理解为什么。

结果不应仅显示满足两个条件的匹配吗?

我确信可能有更好的方法来实现这一点,但我对SQL很陌生,并试图获得基础知识。

我真的很感激一些帮助

1 个答案:

答案 0 :(得分:3)

更改WHERE子句以显式指示条件组,而不是允许AND和OR的优先级确定结果。

WHERE
(pps.Name LIKE 'Helmets' OR pps.Name LIKE 'Gloves')
    AND
    (pp.Color LIKE 'Yellow' OR pp.Color LIKE 'Blue' OR pp.Color LIKE 'Black')

或更好

WHERE pps.Name IN('Helmets','Gloves')
    AND
    pp.Color IN ('Yellow','Blue','Black')