7

问题是这个。。

表是这样的。。

+--------------------------+---------+------+-----+---------+----------------+
| 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)

谁能给我解释一下?谢谢!

4

3 回答 3

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 

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

现在,使用 group by,它评估 的having每个值的条件facility_map_listing_id。最多可以返回与 的不同值一样多的行facility_map_listing_id

于 2012-05-27T15:48:19.280 回答
6

我认为应该解释一些事情:

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

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

于 2012-05-27T15:48:48.357 回答
1

我们可以在没有子句的情况下使用 HAVING 子句,GROUP BYSELECT列和HAVING列应该与聚合函数一起使用:

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

HAVING一般与GROUP BY子句配合使用,主要用于通过聚合函数对数据进行操作和过滤。当不使用 GROUP BY 时,HAVING 的行为类似于 WHERE 子句。

HAVING 为子句设置条件group by,类似于 where 为 select 子句设置条件的方式。

看到这个这个

于 2012-05-27T15:54:58.763 回答