코딩테스트/SQL

[SQL][DISTINCT][SELF_JOIN] 📍우유와 요거트가 담긴 장바구니

박소민 2025. 6. 10. 17:16
우유와 요거트가 담긴 장바구니
 

프로그래머스

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

programmers.co.kr

 

  • 내 풀이
    • 셀프 조인으로 요거트/밀크를 각각 가진 테이블을 조인해서 구함
SELECT P1.CART_ID
FROM CART_PRODUCTS P1
JOIN (SELECT *
      FROM CART_PRODUCTS
    WHERE NAME='Yogurt') AS P2
ON P1.CART_ID = P2.CART_ID
WHERE P1.NAME='Milk'
ORDER BY 1

 

 

  • 다른 사람 풀이
    • GROUP BY+ HAVING 으로 풀이
  1. FROM
    CART_PRODUCTS 테이블을 읽습니다.
  2. WHERE
    NAME이 'Milk' 또는 'Yogurt'인 행만 필터링합니다.
    즉, 조건에 맞는 행만 남깁니다.
  3. GROUP BY
    필터링된 행들을 CART_ID 기준으로 그룹화합니다.
  4. HAVING
    각 그룹에서 DISTINCT NAME의 개수가 2인지 확인합니다.
    즉, Milk와 Yogurt가 모두 있는 장바구니만 남깁니다.
    • DISTINCT 없이 COUNT(NAME) = 2라고 조건을 걸면:
    • Milk, Milk만 들어 있어도 COUNT(NAME)이 2가 되기 때문에 오답이 나올 수 있음
  5. SELECT
    조건을 통과한 그룹에서 CART_ID만 추출합니다.
  6. ORDER BY
    결과를 CART_ID 기준으로 오름차순 정렬합니다.
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk', 'Yogurt')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY CART_ID;