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排序