본문 바로가기
SQL/코딩테스트

[leetcode / MySQL] 570. Managers with at Least 5 Direct Reports

by Hi_heidi 2024. 1. 31.

문제

💡 Write a solution to find managers with at least five direct reports. Return the result table in any order.

 

테이블 형태

 

풀이

SELECT e2.name
FROM Employee e1
    INNER JOIN Employee e2 ON e1.managerId=e2.id
GROUP BY e1.managerId
HAVING COUNT(DISTINCT e1.id) >= 5

 

해설

SELECT e2.name
FROM Employee e1
    INNER JOIN Employee e2 ON e1.managerId=e2.id
GROUP BY e1.managerId
HAVING COUNT(DISTINCT e1.id) >= 5
  • 최소 5명 이상의 부하직원을 둔 직원명을 출력해야 하는 문제다
  • Employee 테이블을 e1과 e2의 서로 다른 테이블로 정의하고 e1.managerId가 e2.id와 동일할 때 조인하여 직원별 관리자 정보를 볼 수 있도록 했다
  • e1.managerId 를 기준으로 그룹화하여 매니저가 동일한 데이터끼리 그룹핑한 뒤, HAVING 조건에서 해당 그룹의 e1.id의 고유값을 COUNT했을 때 5보다 크거나 같은 그룹만 필터링해 관리자 이름(=e2.name)을 출력하도록 했다
  • 처음에 기준 테이블(e1)의 데이터 소실을 방지하기 위해 LEFT JOIN으로 했다가 fail했는데, 관리자 데이터가 테이블에 없을 경우 아무것도 출력하지 않아야 하는데 NULL을 출력해서 fail되었다. 이후 INNER JOIN으로 바꿔 매니저가 없을 경우 데이터를 포함시키지 않도록 하니 패스되었다. 런타임 하위 13.78% 라 이 코드는 속도가 느리다

 

2번째 풀이

SELECT name 
FROM Employee 
WHERE id IN (SELECT managerId 
            FROM Employee 
            GROUP BY managerId 
            HAVING COUNT(*) >= 5)
  • WHERE문 서브쿼리로 조건을 만족하는 id만 필터링해 이름을 출력해주었다. WHERE문 서브쿼리는 Employee 테이블을 managerId 로 그룹핑한 뒤 데이터의 개수가 5개 이상인 managerId 를 필터링했고, 메인쿼리에서 IN을 사용해 id가 이에 포함되는 데이터만 필터링했다. 그리고 해당 id의 이름을 출력하는 방법으로 해결했다. 554ms로 83.21%보다 빠른 쿼리다.