在MYSQL中使用具有多个条件的查询
例如,有一个包含商品属性的表。每个产品可以有多个值性质相同的 货物在MYSQL中使用具有多个条件的查询,mysql,Mysql,例如,有一个包含商品属性的表。每个产品可以有多个值性质相同的 货物 goods_id | property | value 1 |color | red 1 |size | 100 1 |size | 200 2 |color | red 2 |color | green 2 |size | 200 如果我需要查找颜色为红色且大
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返回商品\u 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。如何更改第二个查询以返回正确的结果?感谢您的建议将您的病情更改为:
HAVING COUNT(DISTINCT property) = 2
将您的状况更改为:
HAVING COUNT(DISTINCT property) = 2
这是您的桌子:
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条款,因为您只需要计数为2的货物,所以剩下的是:
1 | color | red
1 | size | 100
由于您将其分组,因此显示goods\u id
后只剩下1
现在,在第二个查询中,您有:
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
再次基于标准,无需具有颜色的属性,且其值为红色或绿色或大小的属性和值100
。因此,您将得到以下结果:
goods_id | property | value
1 | color | red
1 | size | 100
2 | color | red
2 | color | green
由于具有COUNT(goods\u id)=2的子句,自然会产生1
和2
的两个goods\u id
换句话说,查询结果是正确的
所以,如果你只想要一个结果,那么你可以使用
LIMIT 1
或者您的查询可能是错误的,因此您需要更改其中的一部分。这是您的表:
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条款,因为您只需要计数为2的货物,所以剩下的是:
1 | color | red
1 | size | 100
由于您将其分组,因此显示goods\u id
后只剩下1
现在,在第二个查询中,您有:
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
再次基于标准,无需具有颜色的属性,且其值为红色或绿色或大小的属性和值100
。因此,您将得到以下结果:
goods_id | property | value
1 | color | red
1 | size | 100
2 | color | red
2 | color | green
由于具有COUNT(goods\u id)=2的子句,自然会产生1
和2
的两个goods\u id
换句话说,查询结果是正确的
所以,如果你只想要一个结果,那么你可以使用
LIMIT 1
或者您的查询可能是错误的,因此您需要更改其中的一部分。顺便问一下,您希望得到什么结果?也请发帖。顺便问一下,你期望得到什么结果?请也张贴。您的解决方案是唯一的特殊情况,我已经描述。但是如果id=2的产品的属性大小为100,那么请求应该返回id为1和2的商品。但无论如何,感谢您的查询分析,您的解决方案是我描述的唯一特殊情况。但是如果id=2的产品的属性大小为100,那么请求应该返回id为1和2的商品。但无论如何,谢谢你的查询分析