Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MYSQL中使用具有多个条件的查询_Mysql - Fatal编程技术网

在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的商品。但无论如何,谢谢你的查询分析