SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 21일차(1) 26.01.19(월)

nom_de_plume 2026. 1. 19. 09:45

부제:

우유와 요거트가 담긴 장바구니, 레벨 4

 

1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/62284
2. 정답 코드:

=> 집계 함수와 HAVING 활용

SELECT cart_id
from cart_products
where name in ('Milk','Yogurt')
group by cart_id
having count(distinct name) >= 2
order by cart_id;

=> 교집합(INTERSECT) 개념 사용 ( (Milk를 포함하는 cart_id 목록) INTERSECT (Yogurt를 포함하는 cart_id 목록) )

SELECT cart_id FROM cart_products WHERE name = 'Milk'
INTERSECT
SELECT cart_id FROM cart_products WHERE name = 'Yogurt'
ORDER BY cart_id;

=> 셀프 조인(Self Join) 활용 (같은 테이블을 두 번 불러와서(FROM cart_products A, cart_products B) 조인하는 방법)

SELECT DISTINCT A.cart_id
FROM cart_products A
JOIN cart_products B ON A.cart_id = B.cart_id
WHERE A.name = 'Milk'
  AND B.name = 'Yogurt'
ORDER BY A.cart_id;


3. 오류 상황:

SELECT cart_id
from cart_products
where name in ('Milk','Yogurt')
group by cart_id
order by cart_id;

=> 필터링 부족


4. 시도 방법:

=> having 절 사용


5. 최종 문제 해결 방법:

=> 단순히 그 그룹 안에 'Milk'나 'Yogurt'가 있는지를 보는 게 아니라, "서로 다른 종류의 이름이 몇 개 존재하는가"를 체크하는 것 필요. HAVING 절에서 COUNT(DISTINCT name)의 값이 2 이상일 때 '둘 다' 가진 것이다.