2012-05-27 104 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