MySQL 프로그래머스 | 특정 세대의 대장균 찾기 (재귀쿼리로 자식 세대 구하기)

    728x90

     

    문제

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

     

    프로그래머스

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

    programmers.co.kr

    • 3세대 대장균의 ID(ID) 를 출력하는 SQL 문 작성
    • 결과는 대장균 ID 기준 오름차순 정렬

     

    테이블

    ECOLI_DATA

     

     

    풀이과정

    # 세대 구분 재귀쿼리 만들기

    • 재귀쿼리 첫 번째 테이블은 PARENT_ID가 NULL인 1세대의 경우, GENERATION을 1로 명명
    • 재귀쿼리 두 번째 테이블부터는 자신의 PARENT_ID가 이전 재귀쿼리 결과 테이블의 ID와 같을 때
      GENERATION이 +1씩 되도록 함 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH RECURSIVE GE AS (
        SELECT ID, 
               1 AS GENERATION
        FROM   ECOLI_DATA
        WHERE  PARENT_ID IS NULL
     
        UNION ALL
     
        SELECT A.ID, 
               B.GENERATION + 1 AS GENERATION
        FROM   ECOLI_DATA A, GE B
        WHERE  A.PARENT_ID = B.ID
    )
    cs

     

     

    # 원래 테이블과 세대구분 테이블 조인

    • 원래 테이블의 ID가 세대 구분 테이블의 ID와 같을 때 조인되게 함 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    WITH RECURSIVE GE AS (
        SELECT ID, 
               1 AS GENERATION
        FROM   ECOLI_DATA
        WHERE  PARENT_ID IS NULL
     
        UNION ALL
     
        SELECT A.ID, 
               B.GENERATION + 1 AS GENERATION
        FROM   ECOLI_DATA A, GE B
        WHERE  A.PARENT_ID = B.ID
    )
     
    SELECT *
    FROM   ECOLI_DATA A, GE B
    WHERE  A.ID = B.ID
    cs

     

     

    # 정답

    • 3세대 대장균의 ID만 출력하라고 했으므로 WHERE절에 GENERATION = 3 조건 주기
    • 문제에서 요구한대로 ID 별로 오름차순 정렬까지 해주면 끝!
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    WITH RECURSIVE GE AS (
        SELECT ID, 
               1 AS GENERATION
        FROM   ECOLI_DATA
        WHERE  PARENT_ID IS NULL
     
        UNION ALL
     
        SELECT A.ID, 
               B.GENERATION + 1 AS GENERATION
        FROM   ECOLI_DATA A, GE B
        WHERE  A.PARENT_ID = B.ID
    )
     
    SELECT A.ID
    FROM   ECOLI_DATA A, GE B
    WHERE  A.ID = B.ID
    AND    B.GENERATION = 3
    ORDER BY A.ID
    cs

     

     

     

    728x90

    댓글