【问题标题】:List all employees and the number of people they supervise in mysql列出所有员工及其在mysql中监管的人数
【发布时间】:2017-06-18 19:29:53
【问题描述】:

我有一张员工表。每个员工都有一个员工 ID。一些员工有一个主管字段,该字段链接回另一个员工的 ID。现有员工10人,其中监事2人,每人监事4人。我正在尝试获取所有员工的列表以及他们监督的其他员工的数量。到目前为止,我似乎只能让主管和他们监督的人数显示出来。这是我的查询:

SELECT s.employee_name, COUNT(*)
FROM employee e
     join employee s on e.supervisor_id= s.employee_id
group by s.
order by s.employee_name;

我尝试将 JOIN 更改为 RIGHT JOIN,它现在将显示所有 10 名员工,其中两名主管显示为有 4 人被他们监督,但它显示所有其他人没有人可以监督为 1 而不是 0 . 我敢肯定这是我缺少的一些简单的东西。

样本数据:

employee_name, employee_name, supervisor_id,
'10111', 'Sydnee K. Stevens' NULL
'10870', 'Colton C. Rocha', '10111'
'11425', 'Astra V. Sharp','10111'
'12973', 'Melanie X. Rojas','10111'
'14451', 'Bethany Roman','10111'
'14597', 'Lydia Edwards', NULL
'16153', 'Selma Q. Conley', '14597'
'17730', 'Kristen B. Malone', '14597'
'17762', 'Barrett B. Bauer', '14597'
'18628', 'Shana Z. Flowers','14597'

【问题讨论】:

  • 请提供样本数据和预期结果。 PS - “一些”有主管字段?
  • 应该是“有些员工有 supervisor_id”
  • "所有其他没有人监督的都是 1 而不是 0" - 这是因为 COUNT(*)。试试COUNT(e.supervisor_id)
  • 啊,这就是我所缺少的。谢谢。

标签: mysql group-by right-join


【解决方案1】:

我们通过一个 select 加入您的员工表,就像我们将它加入一个真实的表一样。选择将包含所有 supervisor_id 和 supervisor_id 字段中出现的次数(将忽略 supervisor_id 为空的记录)。

SELECT e.employee_id, e.employee_name, s.supervising 
FROM employee e
LEFT JOIN (SELECT supervisor_id, count(*) as supervising 
           FROM employee
           WHERE supervisor_id is NOT NULL
           GROUP BY supervisor_id) AS s
ON(e.employee_id = s.supervisor_id)

【讨论】:

  • 谢谢,按预期工作。保罗的建议在我已有的范围内也有效。获得更多的一种思考问题的方式。
【解决方案2】:

使用LEFTRIGHT JOIN COUNT(*) 将始终至少为1。如果使用LEFT JOINRIGHT JOIN 令人困惑),您只需要计算右表列中的值。 COUNT(column) 将忽略该列中所有为 NULL 的行。

SELECT s.*, COUNT(e.supervisor_id) as num_supervised
FROM employee s
LEFT JOIN employee e on e.supervisor_id = s.employee_id
group by s.employee_id
order by s.employee_name;

【讨论】:

  • 你能解释一下为什么leftrightcount(*) 总是至少一个吗?只是为了让我更好地了解它的工作原理。
  • @user2328273 COUNT(*) 将计算至少有一列具有非空值的所有行。而COUNT(columnName) 仅计算该列中具有 NOT NULL 值的行。查看示例here - 没有仅包含 NULL 的行。
  • @user2328273 也看看第一条评论here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2016-06-05
  • 2023-02-01
  • 2019-10-07
  • 1970-01-01
  • 2021-12-29
  • 2020-07-06
相关资源
最近更新 更多