출처: https://leetcode.com/problems/managers-with-at-least-5-direct-reports/
테이블:Employee
+-------------+---------+
| 열 이름 | 데이터 유형 |
+-------------+---------+
| id | int |
| name | varchar |
| department | varchar |
| managerId | int |
+-------------+---------+
id는 이 테이블의 기본 키(고유 값을 가진 열)입니다.
이 테이블의 각 행은 직원의 이름, 소속 부서 및 관리자의 ID를 나타냅니다.
managerId가 null인 경우 해당 직원은 관리자가 없습니다.
어떤 직원도 자기 자신의 관리자가 될 수 없습니다.
직속 부하 직원이 5명 이상인 관리자를 찾는 솔루션을 작성하세요 .
결과 테이블을 어떤 순서 로든 반환합니다 .
결과 형식은 다음 예시와 같습니다.
예시 1:
입력:
직원 테이블:
+-----+-------+------------+-----------+
| id | name | department | managerId |
+-----+-------+------------+-----------+
| 101 | John | A | null |
| 102 | Dan | A | 101 |
| 103 | James | A | 101 |
| 104 | Amy | A | 101 |
| 105 | Anne | A | 101 |
| 106 | Ron | B | 101 |
+-----+-------+------------+-----------+ 출력:
+------+
| name |
+------+
| John |
+------+
내가 한 풀이
# Write your MySQL query statement below
SELECT e2.name
FROM Employee e1
JOIN Employee e2
ON e1.managerId = e2.id
GROUP BY e2.id, e2.name -- 추가 할 내용
HAVING count(*) >= 5
트러블 슈팅
GROUP BY 절을 넣어줘야 한다.
GROUP BY 없이 HAVING count(*)를 사용하면 전체 결과 행을 하나의 덩어리로 보고 개수를 세어버린다.
더 나아가 두개를 GROUP BY 해야 한다.
이름(e2.name)으로만 묶으면, 만약 동명이인 매니저가 있을 경우 그 둘의 부하직원이 합쳐져서 계산되는 오류가 생길 수 있다.
더 나아가 조인 안쓰는 방법
SELECT name
FROM Employee
WHERE id IN (
SELECT managerId
FROM Employee
GROUP BY managerId
HAVING COUNT(*) >= 5
);