PS/SQL
[프로그래머스] 대장균들의 자식의 수 구하기
행복한라이언
2024. 5. 1. 22:24
728x90
반응형
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/299305
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 핵심
- LEFT JOIN을 이용하고 ID와 PARENT_ID을 가지고 조인한다. 그러면 밑의 그림과 같이 나오게 된다. 그런데 ID가 지금 부모를 의미하고 PARENT_ID를 갖는 것은 자식을 의미한다. 따라서 ID 2는 자식이 2명이다. 아무튼 부모한테 몇 명의 자식이 있는지 확인하는 것이므로 ID로 GROUP BY 진행한다.
- GROUP BY는 정의된 컬럼만 사용가능하다. ID만 SELECT절에 사용가능하며 자식의 수는 COUNT로 로우의 개수를 센다.
- IFNULL(값1, 값2): 값1이 NULL이면 값2를 출력한다.
- IF( 조건문, 참일때 값, 거짓일때 값)
- COALESCE(값1, 값2, ...)
- 값1이 NULL이 아니면 값1 반환
- 값1이 NULL이고 값2가 NULL이 아니면 값2 반환
- ....모든 값이 NULL일 경우 NULL 반한
2. 코드(MySQL)
with tmp as (
select P.ID, count(C.PARENT_ID) as CHILD_COUNT
from ECOLI_DATA as P
left join ECOLI_DATA as C on P.ID = C.PARENT_ID
group by P.ID
)
select *
from tmp
order by tmp.ID asc;
-- ifnull 사용
with tmp as (
select P.ID, ifnull(count(C.PARENT_ID), 0) as CHILD_COUNT
from ECOLI_DATA as P
left join ECOLI_DATA as C on P.ID = C.PARENT_ID
group by P.ID
)
select *
from tmp
order by tmp.ID asc;
-- if 사용
with tmp as (
select P.ID, if(count(C.PARENT_ID) is not null, count(C.PARENT_ID), 0) as CHILD_COUNT
from ECOLI_DATA as P
left join ECOLI_DATA as C on P.ID = C.PARENT_ID
group by P.ID
)
select *
from tmp
order by tmp.ID asc;
-- coalesce 사용
with tmp as (
select P.ID, coalesce(count(C.PARENT_ID), 0) as CHILD_COUNT
from ECOLI_DATA as P
left join ECOLI_DATA as C on P.ID = C.PARENT_ID
group by P.ID
)
select *
from tmp
order by tmp.ID asc;
728x90
반응형