Mysql 选择、分组和计数查询

Mysql 选择、分组和计数查询,mysql,sql,Mysql,Sql,我在下面有一个样本表 +-------------+-------------+-------------+----------+------------+---------------------------------+----------+---------------+ | employee_id | first_name | last_name | email | joined_date| title | salary

我在下面有一个样本表

+-------------+-------------+-------------+----------+------------+---------------------------------+----------+---------------+
| employee_id | first_name  | last_name   | email    | joined_date| title                           | salary   | supervisor_id |
+-------------+-------------+-------------+----------+------------+---------------------------------+----------+---------------+
|         100 | John        | King        | EM1      | 1984-06-17 | CEO                             | 14000.00 |          NULL |
|         101 | Leona       | Kochhar     | EM2      | 1993-09-21 | COO                             | 10000.00 |           100 |
|         102 | Lex         | De Haan     | EM3      | 1992-01-13 | CFO                             | 9000.00  |           100 |
|         103 | Alexander   | Hunold      | EM4      | 2001-04-03 | Gamer                           |  5000.00 |           102 |
|         104 | Dave        | William     | EM5      | 2002-05-21 | Gamer                           |  2000.00 |           103 |
|         105 | David       | Austin      | EM6      | 2002-06-25 | Gamer                           |  2800.00 |           103 |
|         106 | Valli       | Longwind    | EM7      | 2002-02-43 | Gamer                           |  2800.00 |           103 |
某些员工是此表中其他员工的主管。请注意,主管id是员工id

我的任务是仅使用SELECT语句获取员工id、姓名、主管的工资以及主管下的员工总数

在我看来,我知道我需要使用某种分组和计数。首先,统计每个主管下的员工数量,其次是按主管ID分组。我通过使用此查询,使用简单的计数和分组来获得输出:

SELECT employee_id, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY supervisor_id;
这将输出主管id和主管id下的员工数量,即:

+---------------+----------------------+
| supervisor_id | COUNT(supervisor_id) |
+---------------+----------------------+
|          NULL |                    0 |
|           100 |                    2 |
|           101 |                    0 |
|           102 |                    0 |
|           103 |                    3 |
*上表稍作修改-这是一个示例输出

如上所述,supervisor_id是同一表格中员工的员工id。我的问题是,我无法使此表显示员工id、姓名和薪水以及计数列。最终结果必须显示链接到主管id的员工id、姓名、工资、计数

我试过这个

SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY employee_id, first_name, salary, supervisor_id;
SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY supervisor_id;
但这只是返回原始表

我也试过这个

SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY employee_id, first_name, salary, supervisor_id;
SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY supervisor_id;
它返回SELECT list的错误表达式1不在GROUP BY子句中,并且包含未聚合列,根据联机信息,这是我如何创建查询的,不能混合聚合列和非聚合列


谁能给我指点一下吗?谢谢。

我想你只需要在这里自左加入即可:

顺便说一句,您在注释中提到要使用计数=0。您最好不要将HAVING用于此目的,而只是将此查询更改为内部联接。它将以同样但更有效的方式进行。 请试试这个

SELECT E1.supervisor_id,count(E2.supervisor_id) FROM `EMPLOYEE` AS E1
LEFT JOIN (select supervisor_id FROM EMPLOYEE GROUP BY 
supervisor_id) AS E2 ON E1.supervisor_id = E2.supervisor_id
GROUP BY E1.supervisor_id

提示:在FROM下的子查询中使用GROUP BY,然后在EXTER-query中执行联接。这需要递归CTE或递归存储过程(如果在数据库中执行)。您使用的是什么版本的MySQL?如果您设置了某种db/sql小提琴,这也会很有帮助。谢谢。基本上我需要在一个查询中连接两个表@GordonLinoff,我只是在CMD提示符下运行这个。这实际上是教育性的。主管下的员工总数仅指主管下的第一级或以下级别?我假设是以下级别-基本上包括任何监督其他人的员工。嗨,这都在同一个表中。必须加入?@SunnyBoiz您是否尝试运行查询?yes JOIN对执行自连接查询是有效的。我已尝试您的查询,并将HAVING子句添加到筛选器0。但我认为这在逻辑上有点错误-计数应该是计算主管id而不是员工id。我想计数部分的更改应该是正确的?我正在尝试戴的建议,在从太小组。@SunnyBoiz这将是不正确的。尝试将s别名视为supervisors表,e别名视为employee表。因此,我们选择所有主管,然后统计向该主管报告的所有员工。