본문 바로가기
PS/SQL

[프로그래머스] 대장균들의 자식의 수 구하기

by 행복한라이언 2024. 5. 1.
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
반응형