我有一个简单的问题。我知道我们不能在 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/