我是SQL的新手,我正在学习为初学者提供的免费YouTube MySQL课程.

两天前我给自己出了个问题,现在我找到了一个变通的办法,但也许有更好的方法来解决它.

emp_id super_id
100 NULL
101 100
102 100
103 102
104 102
105 102
106 100
107 106
108 106

Emp_id标记每个员工,Super_id-他们的主管.我想知道每个员工有多少下属.

这只是我学习目的的一个问题,在现实世界中没有任何意义.如果这真的很简单,我是过于复杂,我很抱歉.我使用的是自连接,因为这里只有一个表.

我在谷歌上找到了这个:

SELECT A1.A, COUNT(*)
  FROM Anonymous AS A1
  JOIN Anonymous AS A2 ON A1.A = A2.B
 GROUP BY A1.A;

经过这样的调整后,它几乎起作用了,只是它 for each 应该有0个下属的员工返回1个下属:

SELECT emp1.emp_id, COUNT(*) AS Subordinates
FROM employee AS emp1
LEFT JOIN employee AS emp2
ON emp1.emp_id = emp2.super_id
GROUP BY emp1.emp_id
;

顺便说一句,我不知道self 加入的原因和原理.但这对我的任务很管用.在下面的调整之后,它做了我想做的所有事情,但是如果有一个员工正好有一个下属,它会说他没有下属(我想).所以这不是一个真正的解决方案.也许有一种更简单或更优雅的方法来做到这一点呢?

SELECT emp1.emp_id, IF (COUNT(*)>1, COUNT(*), NULL) AS Subordinates
FROM employee AS emp1
LEFT JOIN employee AS emp2
ON emp1.emp_id = emp2.super_id
GROUP BY emp1.emp_id
;

结果

emp_id subordinates
100 3
101 null
102 3
103 null
104 null
105 null
106 2
107 null
108 null

推荐答案

在自联接表(employee2)上使用COUNT()如何?

select e1.emp_id,
       count(e2.emp_id) as subordinates
  from employee as e1
  left join employee as e2
  on e1.emp_id = e2.super_id
group by e1.emp_id

菲德尔:https://www.db-fiddle.com/f/322VZ9CfYjMMtg8i81T2Dd/1

Mysql相关问答推荐

同一类型对象之间的多对多关系

运行简单查询时Prisma预准备语句错误

使用复合主键更新后的MySQL触发器失败

Eloquent:通过国外模型得到平均分

如何通过SQL来计算到达特定值的行的数量

带有 JOIN 和 WHERE 子句的 INSERT 语句

时间戳上滚动窗口的 SQL 计数不同

如何在Pandas 中使用 to_sql

sequelize 中最好的更新方法是什么

使用适配器设计模式和外观设计模式实现

MySQL DISTINCT 日期仅返回特定表的 1 个值.相同的查询适用于其他表

相关查询 - 在派生表中,我可以有多个嵌套级别吗?

创建将列与多个值进行比较的索引

mysql 执行注释部分

如果我创建一个没有主键的表然后添加一个主键,主键是聚集索引吗?

无法在两个 mysql 表上执行内部联接

让 MySQL 在 OSX 10.7 Lion 上运行

将行插入 MySQL 数据库的最有效方法

为什么 MySQL 自动增量会在插入失败时增加?

我在哪里可以下载 mysql jdbc jar?