프로그래머스/My SQL

💫멸종위기의 대장균 찾기

싱싱한복초이 2024. 12. 31. 15:00

https://school.programmers.co.kr/learn/courses/30/lessons/301651

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

[문제]

각 세대별 자식이 없는 개체의 수(COUNT)와 세대(GENERATION)를 출력하는 SQL문을 작성해주세요. 이때 결과는 세대에 대해 오름차순 정렬해주세요. 단, 모든 세대에는 자식이 없는 개체가 적어도 1개체는 존재합니다.

 

[풀이]

with recursive tmp as (
    select id, parent_id, 1 as generation
    from ecoli_data
    where parent_id is null
    union all
    select e.id, e.parent_id, tmp.generation + 1
    from tmp join ecoli_data e
    on tmp.id = e.parent_id
)

select count(*) count, generation
from tmp
where id not in (
    select distinct parent_id
    from tmp
    where parent_id is not null)
group by generation
order by 2;

-참고

https://velog.io/@vvo_ter/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv5-%EB%A9%B8%EC%A2%85%EC%9C%84%EA%B8%B0%EC%9D%98-%EB%8C%80%EC%9E%A5%EA%B7%A0-%EC%B0%BE%EA%B8%B0MySQL

 

프로그래머스 Lv5 멸종위기의 대장균 찾기(MySQL)

WITH RECURSIVE 재귀 쿼리

velog.io

 

 

WITH RECURSIVE란?

 

"WITH RECURSIVE는 SQL에서 재귀적(Common Table Expression, CTE) 을 정의하는 기능입니다. 재귀는 데이터를 반복적으로 참조하여 부모-자식 관계나 계층 구조(hierarchy)를 탐색할 때 사용됩니다."

 

SELECT *
FROM tmp

에 대한 결과로 아래가 출력됨

 

+ 다음 SELECT절

select count(*) count, generation
from tmp
where id not in (
    select distinct parent_id
    from tmp
    where parent_id is not null)
group by generation
order by 2;

=> 전체적인 흐름