我是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 |