2012-05-27 27 views
6

问题是这样的..了解GROUP BY语句的行为

表是这样的..

+--------------------------+---------+------+-----+---------+----------------+ 
| Field     | Type | Null | Key | Default | Extra   | 
+--------------------------+---------+------+-----+---------+----------------+ 
| facility_map_id   | int(10) | NO | PRI | NULL | auto_increment | 
| facility_map_facility_id | int(10) | NO | MUL | NULL |    | 
| facility_map_listing_id | int(10) | NO |  | NULL |    | 
+--------------------------+---------+------+-----+---------+----------------+ 

的数据是这样的..

+-----------------+--------------------------+-------------------------+ 
| facility_map_id | facility_map_facility_id | facility_map_listing_id | 
+-----------------+--------------------------+-------------------------+ 
|    248 |      1 |      18 | 
|    259 |      1 |      19 | 
|    206 |      1 |      20 | 
|    244 |      1 |      21 | 
|    249 |      2 |      18 | 
|    207 |      2 |      20 | 
|    208 |      3 |      20 | 
|    245 |      3 |      21 | 
|    260 |      4 |      19 | 
|    261 |      5 |      19 | 
|    246 |      6 |      21 | 
|    250 |      7 |      18 | 
|    247 |      8 |      21 | 
+-----------------+--------------------------+-------------------------+ 

我运行此查询:

SELECT facility_map_listing_id 
FROM facility_map 
WHERE facility_map_facility_id IN(1, 2) 
GROUP BY facility_map_listing_id 
HAVING count(DISTINCT facility_map_facility_id) >= 2 

并得到这个..

+-------------------------+ 
| facility_map_listing_id | 
+-------------------------+ 
|      18 | 
|      20 | 
+-------------------------+ 
2 rows in set (0.00 sec) 

这是正确的! - 但任何人都可以解释,为什么GROUP BY需要在声明中?

,如果它不是,我运行相同的查询而忽略了GROUP BY我得到..

+-------------------------+ 
| facility_map_listing_id | 
+-------------------------+ 
|      18 | 
+-------------------------+ 
1 row in set (0.00 sec) 

任何一个可以解释这样对我?谢谢!

回答

5

如果没有group by,则集合如count作为整体工作。所以这个查询返回零个或一个行:

SELECT facility_map_listing_id 
FROM facility_map 
WHERE facility_map_facility_id IN(1, 2) 
HAVING count(DISTINCT facility_map_facility_id) >= 2 

它会返回一个行如果having条件满足,且空集,否则。

现在,使用group by,它会为facility_map_listing_id的每个值评估having条件。这可以返回最多的行数,因为有不同的值facility_map_listing_id

+0

布里尔 - 解释的事情完全。谢谢你的帮助! –

5

我觉得应该this解释的事情:

如果通过省略组,而不是由where子句 回报作为单个组中排除的所有行。

所以,基本上,你仍然使用一组...只是整个集合。

+0

这是正确的答案。 –

+0

感谢您的资源!我现在理解得好多了。我提出了你的答案! –

1

我们可以使用HAVING子句没有GROUP BY条款,但SELECT列和HAVING列应与聚合函数一起使用:

  • AVG() - 返回平均值
  • COUNT() - 返回行
  • FIRST()的数量 - 返回的第一个值
  • LAST() - 返回的最后一个值
  • MAX() - 返回最大的价值
  • MIN() - 返回最小值
  • SUM() - 返回总和

HAVING通常与GROUP BY子句中使用,主要用于通过使用聚合函数来操作和过滤数据。 当不使用GROUP BY时,HAVING的行为与WHERE子句相似。

具有用于group by子句集的条件下,类似于其中,其中设置条件为select子句的方式。

See ThisThis one