理解GROUP BY语句的行为

Jon*_*ard 7 mysql sql group-by having-clause

问题是这个......

表是这个..

+--------------------------+---------+------+-----+---------+----------------+
| 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    |                |
+--------------------------+---------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

这是数据..

+-----------------+--------------------------+-------------------------+
| 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 |
+-----------------+--------------------------+-------------------------+
Run Code Online (Sandbox Code Playgroud)

我运行这个查询:

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 
Run Code Online (Sandbox Code Playgroud)

得到这个..

+-------------------------+
| facility_map_listing_id |
+-------------------------+
|                      18 |
|                      20 |
+-------------------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

哪个是对的! - 但有人可以解释一下,为什么GROUP BY需要在声明中?

如果它不是,我运行相同的查询,留下GROUP BY我得到..

+-------------------------+
| facility_map_listing_id |
+-------------------------+
|                      18 |
+-------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释一下吗?谢谢!

And*_*mar 6

如果没有a 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 
Run Code Online (Sandbox Code Playgroud)

如果满足having条件,它将返回一行,否则返回空集.

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


Jus*_*ony 6

我认为应该解释一下:

如果省略group by,则where子句未排除的所有行将作为单个组返回.

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