在MYSQL中使用具有多个条件的HAVING进行查询

时间:2013-06-20 09:38:10

标签: mysql

例如,有一个包含商品属性的表格。每个产品可以具有相同属性的多个值。

商品

goods_id | property | value  

1        |color     | red  
1        |size      | 100  
1        |size      | 200  
2        |color     | red  
2        |color     | green  
2        |size      | 200

如果我需要找到所有颜色红色且尺寸 100 的项目,那么我运行此查询:

SELECT goods_id FROM goods
WHERE (property = 'color' AND value = 'red') OR
      (property = 'size' AND value = '100')
GROUP BY goods_id
HAVING COUNT(goods_id) = 2

MYSQL返回goods_id = 1

但如果我需要找到所有颜色为红色或绿色且尺寸为 100 的项目,请执行以下查询

SELECT goods_id FROM goods
WHERE (property = 'color' AND value IN ('red', 'green')) OR
      (property = 'size' AND value = '100')
GROUP BY goods_id
HAVING COUNT(goods_id) = 2

返回ID 1和2,但应该只有1.
如何更改第二个查询以返回正确的结果?感谢您的任何建议

2 个答案:

答案 0 :(得分:1)

将您的HAVING条件更改为:

HAVING COUNT(DISTINCT property) = 2

答案 1 :(得分:0)

这是你的表:

goods_id | property | value
  1       |    color    | red
  1       |    size      | 100
  1       |    size      | 200
  2       |    color    | red
  2       |    color    | green
  2       |    size      | 200

这是你的第一个问题:

  SELECT goods_id FROM goods
  WHERE (property = 'color' AND value = 'red') OR
  (property = 'size' AND value = '100')
  GROUP BY goods_id
  HAVING COUNT(goods_id) = 2

首先没有HAVING子句而只有WHERE语句,您将获得结果:

  1       |    color    | red
  1       |    size      | 100
  2       |    color    | red

但是现在使用HAVING子句,因为你只想要goods_id的计数为2,那么剩下的就是:

  1       |    color    | red
  1       |    size      | 100

自从您对其进行分组后,只显示1,因为您显示goods_id

现在,在您的第二个查询中,您有:

 SELECT goods_id FROM goods
 WHERE (property = 'color' AND value IN ('red', 'green')) OR
  (property = 'size' AND value = '100')
 GROUP BY goods_id
 HAVING COUNT(goods_id) = 2

再次基于标准而没有HAVING条款,您希望property color red并且值为(表示OR)greenpropertysize的{​​{1}}和value的{​​{1}}。所以,你会得到结果:

100

使用goods_id | property | value 1 | color | red 1 | size | 100 2 | color | red 2 | color | green HAVING条款自然会产生COUNT(goods_id)=2goods_id两个1

换句话说,查询结果是正确

因此,如果您只想要一个结果,那么您可以使用

2

或者您的查询可能是错误的,因此您需要更改其中的一部分。