Mysql 使用具有Count Distinct和Group By的Count

Mysql 使用具有Count Distinct和Group By的Count,mysql,count,subquery,Mysql,Count,Subquery,我有两个表格,一个是针对员工的,有id、姓名和公司列,另一个是针对调查结果的表格,有员工id、问题id,作为一名员工对多个结果的回答 |---------------------| | id | name | company | |---------------------| |-----------------------------------------| | id | employee_id | question_id | answer | |---------------------

我有两个表格,一个是针对员工的,有id、姓名和公司列,另一个是针对调查结果的表格,有员工id、问题id,作为一名员工对多个结果的回答

|---------------------|
| id | name | company |
|---------------------|

|-----------------------------------------|
| id | employee_id | question_id | answer |
|-----------------------------------------|
我想选择每个公司的员工总数,以及调查中每个公司的参与者总数


我尝试了以下查询,但执行时间太长:

SELECT employees.company as x, COUNT(DISTINCT (results.employee_id)) "Total Surveys", (SELECT COUNT(employees.id) FROM employees WHERE company = x) "Headcount"
FROM results
JOIN employees ON results.employee_id = employees.id
GROUP BY employees.company
结果

|--------------------------------|
|  x | Total Surveys | Headcount |
|--------------------------------|
| C1 |       15      |    3      |
| C2 |       10      |    5      |
|--------------------------------|

有什么建议吗?

通过从员工到结果的左连接,您可以获得想要的结果;然后,无需子查询即可计算这两个值:

SELECT e.company, 
       COUNT(DISTINCT r.employee_id) AS `Total Surveys`,
       COUNT(DISTINCT e.id) AS `HeadCount`
FROM employees e
LEFT JOIN results r ON r.employee_id = e.id
GROUP BY e.company

执行时间太长,多少时间就是太多?另外,您能告诉我们您在表上放置了哪些索引、每个表中的数据量以及查询执行计划吗?一个带有一些虚拟数据的SQLFIDLE也会非常方便!正如@FMashiro所说,SQLFiddle将大有帮助。我还认为您编写的查询是错误的,因为在将每个公司的员工人数与结果合并之前,您要计算每个公司的员工人数,因此您将始终拥有员工总数,没有链接到实际结果。@FMashiro只是用样本数据更新了问题。@CairoCoder此查询确实会为样本数据返回正确的结果。问题中没有足够的数据来确定它是否显著更快,尽管我希望它能够节省大量查询。