mysql - 聚合函数中的 WHERE

标签 mysql aggregate-functions where-clause having

我有一个简单的问题。我知道我们不能在 MySQL 的聚合函数中使用 WHERE 子句。表结构如下:

+----+------+----------+--------+
| ID | Name | Location | Active |
+----+------+----------+--------+
|  1 | Aaaa | India    | 0      |
|  2 | Aaaa | USA      | 0      |
|  3 | Aaaa | USA      | 1      |
|  4 | Aaaa | India    | 0      |
|  5 | Aaaa | UK       | 0      |
|  6 | Aaaa | India    | 1      |
|  7 | Aaaa | USA      | 1      |
|  8 | Aaaa | USA      | 0      |
|  9 | Aaaa | India    | 0      |
| 10 | Aaaa | UK       | 1      |
+----+------+----------+--------+

我这里的查询是:

SELECT COUNT(*), `location`, `active` FROM `users` GROUP BY `location`;

上面的查询将给出该位置的计数。但是,我只需要活跃用户。因此,我需要一个 WHERE 子句来执行以下操作:

SELECT COUNT(*), `location`, `active` FROM `users` GROUP BY `location` WHERE `active`=1;

以上查询无效。有效的查询将使用HAVING。但是,如果我将查询更改为:

SELECT COUNT(*), `location`, `active` FROM `users` GROUP BY `location` HAVING `active`=1;

计数与原始查询没有什么不同,即:

SELECT COUNT(*), `location`, `active` FROM `users` GROUP BY `location`;

那么,我应该怎么做才能获取该位置的活跃用户数?提前致谢。

最佳答案

在 group by 之前使用 where 子句将根据您的条件过滤结果,您可以根据您的 where 条件进行计数

SELECT COUNT(*), `location`, `active` 
FROM `users` 
 WHERE `active`=1
GROUP BY `location`

除了您的具体问题之外,您还可以将 sum 与您的条件一起使用,这样这将返回 bool 值,您可以根据您的表达式进行计数,例如

SELECT sum(`active`=1), `location`, `active` 
FROM `users` 
GROUP BY `location`

以上求和表达式相当于sum(CASE when active=1 THEN 1 ELSE 0 END)

关于mysql - 聚合函数中的 WHERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350115/

相关文章:

mysql - 添加哪些索引可以加速具有三个条件的 COUNT(*) 查询

php - 按固定日期间隔选择并分组

mysql - 选择 B 列上的总和,其中 A 列与 mysql 相同

mysql 查询分组

php - 检查 mysql 行是否不在数组中

mysql - 在 MySQL 中,我应该如何更改语法以添加 'WHERE' 子句

mysql - Pentaho 计划的 PDF 报告

mysql - 为数组中的所有 id 选择列上具有最大值的所有行

sql - SQLite查询聚合

mysql - (ASP) MS Access -> MySQL : Error in Select, 其中 [..] 字符串