imhamburger 님의 블로그
프로그래머스 SQL 문제풀이 - 대장균들의 자식의 수 구하기 본문
문제설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
Column name | Type | Nullable |
ID | INTEGER | FALSE |
PARENT_ID | INTEGER | TRUE |
SIZE_OF_COLONY | INTEGER | FALSE |
DIFFERENTIATION_DATE | DATE | FALSE |
GENOTYPE | INTEGER | FALSE |
최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.
문제
대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.
예전에 내가 작성한 풀이
select b.cnt_c as ID,
sum(case when b.cnt_p = 0 then 0 else 1 end) as CHILD_COUNT
from(
select ifnull(dd.parent_id,0) cnt_p,
a.d_id cnt_c
from ecoli_data dd
right join(
select d.id d_id
from ecoli_data d) a on dd.parent_id = a.d_id) b
group by ID
order by ID asc
다시 풀어본 풀이
SELECT ee.eeid AS ID,
CASE WHEN e.parent_id IS null THEN 0
ELSE COUNT(ee.eeid) END AS CHILD_COUNT
FROM ecoli_data e
RIGHT JOIN (SELECT id AS eeid FROM ecoli_data) ee ON e.parent_id = ee.eeid
GROUP BY ee.eeid
ORDER BY ID asc
;
첫 번째 쿼리는 불필요한 중첩 서브쿼리와 복잡한 조건문이 많아, 이해하기 어렵고 성능에도 부담을 줄 수 있지만..!
이번에 다시 풀었을 때 join을 한 번 사용하였고 불필요한 서브쿼리를 줄여보았다.
문제를 풀기 전에 어떤식으로 접근하고 해결해나갈지 고민을 조금 더 하는 시간을 가지니 더 효율적으로 쿼리를 작성할 수 있는 것 같다.
'Mysql' 카테고리의 다른 글
Mysql - csv파일 불러올 때 발생하는 에러들 해결하기 (7) | 2024.07.24 |
---|---|
Mysql - 원격에서 로컬로 파일 보내기, Mysql 접속하기 (0) | 2024.07.12 |