[해커랭크 medium] New Companies(MySQL)
https://www.hackerrank.com/challenges/the-company/problem?isFullScreen=true
New Companies | HackerRank
Find total number of employees.
www.hackerrank.com
일단 내가 처음 풀어봤던 방법은 무작정 테이블 4개를 냅다 조인하는 것이다.
근데 나는 where로 조인하는 걸 생각을 못해서... 테이블 4개를 서브쿼리로(...) 조인하면서 엄청난 양의 비효율적인 쿼리를 맛보았다...
그래서 일단 내가 하려고 했던 조인으로.. 좀 더 효율적으로 문제를 푸는 방법을 먼저 소개해보겠다.
select c.company_code, c.founder,
count(distinct l.lead_manager_code), count(distinct s.senior_manager_code),
count(distinct m.manager_code), count(distinct e.employee_code)
from company c
inner join lead_manager l
on c.company_code = l.company_code
inner join senior_manager s
on l.lead_manager_code = s.lead_manager_code
inner join manager m
on s.senior_manager_code = m.senior_manager_code
inner join employee e
on m.manager_code = e.manager_code
group by c.company_code, c.founder
order by c.company_code
그냥 inner join을 계속 이어서 쓰면 되는 것을..^^ 왜 나는 테이블 4개를 무리하게 서브쿼리로 조인하려고 했을까ㅋㅋㅋ
이것이 바로 짬의 차이... 그래 지금이라도 알았으면 됐지 담부턴 이렇게 하자 ! 하하!!
group by랑 order by랑 select는 내가 생각한 게 맞았는데 테이블을 조인하는 것에서 막힌 것이다,,,
그리고 조인하는 두 번째 방법은 그냥 where절에 쓰는 것!
select c.company_code, c.founder,
count(distinct l.lead_manager_code), count(distinct s.senior_manager_code),
count(distinct m.manager_code), count(distinct e.employee_code)
from company c, lead_manager l, senior_manager s, manager m, employee e
where c.company_code = l.company_code
and l.lead_manager_code = s.lead_manager_code
and s.senior_manager_code = m.senior_manager_code
and m.manager_code = e.manager_code
group by c.company_code, c.founder
order by c.company_code
where절로 조인한 것 외에는 위랑 똑같다.
그리고 또 다른 방법은...
SELECT c.company_code, c.founder, COUNT(DISTINCT e.lead_manager_code), COUNT(DISTINCT e.senior_manager_code), COUNT(DISTINCT e.manager_code), COUNT(DISTINCT e.employee_code)
FROM Company AS c
INNER JOIN Employee AS e
ON c.company_code = e.company_code
GROUP BY c.company_code, c.founder
ORDER BY c.company_code;
사실 네 개의 테이블을 다 조인할 필요가 없다..?ㅎ
이미 employee 테이블은 다 조인이 되어 있음.. 그냥 employee 테이블과 company 테이블을 company_code를 중심으로 조인해서 founder이름만 붙여주면 됨...
으음... 그럼 나머지 테이블은 왜 있는 거지...ㅎ 뭔가 속시원하지도 않고 쉬운듯 어려운 문제...
그래도 오늘 배운 건...! 조인할 때 where절을 잘 활용하자..^^