count() 结果不使用 group by

Posted

技术标签:

【中文标题】count() 结果不使用 group by【英文标题】:count() results without using group by 【发布时间】:2020-11-13 13:26:16 【问题描述】:

我正在尝试与此页面上的上一个示例(使用 GROUP BY)非常相似的内容: https://thecodedeveloper.com/mysql-count-function/

参考下表:

id   name   salary   department
 1   Tom    4000     Technology
 2   Sam    6000     Sales
 3   Bob    3000     Technology
 4   Alan   8000     Technology
 5   Jack   12000    Marketing

以下查询:

SELECT department, COUNT(*) AS "Number of employees"
FROM employees
GROUP BY department;

将产生以下输出:

department    Number of employees
Marketing        1
Sales            1
Technology       3

除了我想查看每个部门的员工人数以及表格中的每个用户。

所以我希望输出如下所示:

id   name   salary   department   employees per department
 1   Tom    4000     Technology        3
 2   Sam    6000     Sales             1
 3   Bob    3000     Technology        3
 4   Alan   8000     Technology        3
 5   Jack   12000    Marketing         1

我已经设法实现了我想要的,使用第二个查询来测试第一个查询的每个结果,但它非常慢,我相信有一种更快的方法可以在单个查询中完成。

【问题讨论】:

【参考方案1】:

这是一个窗口计数。在 MySQL 8.0 中:

select e.*, count(*) over(partition by d.department) as number_of_employees
from employees e

在早期版本中,替代方法使用相关子查询:

select e.*,
    (select count(*) from employees e1 where e1.department = e.department) as number_of_employees
from employees e

【讨论】:

虽然还是很慢,有什么办法可以加快速度吗? 我实际上只需要知道每个部门是否有超过一名员工,我可以将子查询限制为2吗? (我试着把 LIMIT 2 放在最后,但我仍然算出超过 2 个结果!) 请发布您最近查询的文本。以及 EXPLAIN SELECT (yourquery) 的 TEXT 结果;这样我们就可以看到优化器对您的查询做了什么。 您好,感谢您的支持。我发现 mysql 8 版本在我的开发环境中既好又快,但不幸的是,我正在使用的服务器使用 5.7 版本,而 5.7 方法非常慢,它比对第一个结果的每个结果进行第二次查询要慢。 老实说,从上周末开始,我正在开发的功能现在已经被废弃了!!!对于其他阅读此问题的人来说,上面的 mysql 8 答案是完美的解决方案(假设您使用的是 mysql 8!)。

以上是关于count() 结果不使用 group by的主要内容,如果未能解决你的问题,请参考以下文章

获取“COUNT”/“GROUP BY”MySQL查询的空结果

原创Java使用RestHighLevelClient操作ElasticSearch,实现多字段Group by并将结果进行count排序

原创Java使用RestHighLevelClient操作ElasticSearch,实现多字段Group by并将结果进行count排序

COUNT(DISTINCT) 和 COUNT(*) + GROUP BY 给出不同的结果

SQL GROUP BY/COUNT 即使没有结果

group by 深入总结(转)