본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 프로그래머스 - 대장균들의 자식의 수 구하기

by kime2 2024. 6. 26.
출처
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요

문제에 대한 해석

-- 조회 : 대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)
-- 조건 : 자식이 없는 경우 count는 0
-- 정렬 : id오름차순

풀이(MYSQL)

with parents as (select parent_id , count(id) as CHILD_COUNT
from ECOLI_DATA
where parent_id is not null
group by parent_id
)
select ECOLI_DATA.id, ifnull(parents.CHILD_COUNT,0) as CHILD_COUNT
from ECOLI_DATA
left join parents
on ECOLI_DATA.id = parents.parent_id
order by ECOLI_DATA.id

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

  1. WITH 절: ECOLI_DATA테이블에서 parent_id가 null이 아닌 경우 그룹화 하여 id의 수를 집계하라
  2. > patents 임시 테이블 : 부모아이디에 따른 자식 수
  3. FROM 절: ECOLI_DATA테이블과 parents 를 left조인하는데 ECOLI_DATA테이블에서 id와 parents테이블에서patent_id가 같을 경우 조인
  4. SELECT 절: ECOLI_DATA테이블의 id, parents의 CHILD_COUNT가 null일 경우(자식이 없는 id일 경우) 0으로 대체
parents 테이블 정답 테이블

실제 부모인 경우인 id와 자식id의 수
> 답은 자식이 없는 id도 모두 있어야 함 


다른사람 풀이 (self join)

SELECT E1.ID, COUNT(E2.ID) AS CHILD_COUNT
FROM ECOLI_DATA AS E1
LEFT JOIN ECOLI_DATA AS E2 ON E1.ID = E2.PARENT_ID
GROUP BY 1
ORDER BY 1

배운점

  • 임시테이블을 만들지 않아도 간단한 쿼리가 있는지 고민
  • ifnull(컬럼, 대체할 값)