1

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

商品

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

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

4

2 回答 2

1

将您的 HAVING 条件更改为:

HAVING COUNT(DISTINCT property) = 2
于 2013-06-20T09:41:24.817 回答
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 子句,因为您只希望商品 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您想要的子句propertycolor并且值为 or (这意味着 OR)redgreenOR propertyof sizeand valueof 100。因此,您将得到以下结果:

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

并且与HAVING从句COUNT(goods_id)=2自然会产生 and 的goods_id两个1结果2

也就是说查询结果是对的

所以,如果你只想要一个结果,那么你可能会使用

LIMIT 1

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

于 2013-06-20T10:02:29.807 回答