코딩테스트 준비/SQL
[프로그래머스] 대장균들의 자식의 수 구하기 (MySQL)
1dolcong
2024. 11. 4. 23:35
https://school.programmers.co.kr/learn/courses/30/lessons/299305
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.

풀이1
- 대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력, 자식이 없다면 자식의 수는 0
- ECOLI_DATA 테이블을 보면 ID가 있고 해당하는 ID의 PARENT_ID가 있음을 볼 수 있다.
자신의 ID가 부모 ID인 칼럼의 갯수를 구하기 위해 SELF_JOIN을 해야함을 유추할 수 있고
ECOLI_DATA 테이블 두개를 A.ID = B.PARENT_ID로 LEFT JOIN를 한다.A(ECOLI_DATA)와 B(ECOLI_DATA)를 LEFT (OUTER) JOIN 시
A.ID != B.PARENT_ID에 해당하는 칼럼(=자식이 없는 ID)은 B테이블에서 NULL로 표시 - 결과를 보면 A.ID를 GROUP BY 하고, COUNT 함수를 사용하면 A.ID에 맞는 자식의 개수를 구할 수 있다.
다만, COUNT 함수를 B 테이블의 칼럼이 아닌 A 칼럼을 기준으로 사용할 경우 실제로 자식이 없는 칼럼도 갯수로 세기 때문에, B 테이블의 칼럼을 가지고 COUNT 함수를 사용해야한다.
- ECOLI_DATA 테이블을 보면 ID가 있고 해당하는 ID의 PARENT_ID가 있음을 볼 수 있다.
※ COUNT(*)는 NULL 값도 세고, COUNT(칼럼)은 칼럼값이 NULL이 아닌 개수를 구해준다.
- 개체의 ID 에 대해 오름차순 정렬
- ORDER BY ID 를 사용한다.
해당 조건들을 파악한 후 쿼리문을 짜면 다음과 같다.
SELECT A.ID, COUNT(B.ID) CHILD_COUNT
FROM ECOLI_DATA A LEFT OUTER JOIN ECOLI_DATA B
ON A.ID = B.PARENT_ID
GROUP BY A.ID
ORDER BY ID;
풀이2
앞선 풀이와 동일하지만, COUNT(B.ID) 대신 SUM 함수와 IF 함수를 사용하여 다른 방식으로 구할 수도 있다.
예를 들어, GROUP의 행마다 B.PARENT가 NULL인 경우에 0 값을 부여하고 그 이외의 값에는 1을 부여하고
그것의 SUM을 구하면 COUNT(B.ID)와 동일한 매커니즘으로 값을 구할 수 있다.
그것의 SUM을 구하면 COUNT(B.ID)와 동일한 매커니즘으로 값을 구할 수 있다.
SELECT A.ID, SUM(IF(B.PARENT_ID IS NULL, 0,1)) CHILD_COUNT -- IF(조건, 참이면 해당 값, 거짓이면 해당 값)
FROM ECOLI_DATA A LEFT OUTER JOIN ECOLI_DATA B
ON A.ID = B.PARENT_ID
GROUP BY A.ID
ORDER BY ID;