例如,有一个包含商品属性的表格。每个产品可以具有相同属性的多个值。
商品
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.
如何更改第二个查询以返回正确的结果?感谢您的任何建议
答案 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)green
或property
或size
的{{1}}和value
的{{1}}。所以,你会得到结果:
100
使用goods_id | property | value
1 | color | red
1 | size | 100
2 | color | red
2 | color | green
HAVING
条款自然会产生COUNT(goods_id)=2
和goods_id
两个1
。
换句话说,查询结果是正确。
因此,如果您只想要一个结果,那么您可以使用
2
或者您的查询可能是错误的,因此您需要更改其中的一部分。