본문 바로가기
코테 공부 🔥

[프로그래머스/SQL] 우유와 요거트가 담긴 장바구니

by 서니서닝 2024. 5. 11.
728x90

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

 

프로그래머스

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

programmers.co.kr

문제 예시

CART_PRODUCTS

원하는 출력

📌 풀이 )

* 틀린 풀이가 있으면 댓글 남겨주세요!

 

총 세가지 풀이를 가져와봤다.

 

풀이 1 ) GROUP BY, HAVING 이용

 

먼저 Milk, Yogurt 둘 중 하나를 가지고 있는 것 들을 찾는다.

다음, 우리는 Milk와 Yogurt 둘 다 가지고 있는 장바구니를 찾고 싶기 때문에, CART_ID를 기준으로 그룹화하여 HAVING COUNT가 2인것을 찾는다.

여기서 COUNT(DISTINCT NAME)은 각 장바구니에 있는 고유한 상품의 개수를 나타낸다. 만약 두 상품을 모두 포함하고 있다면 이 값은 2가 되기 때문에 2로 설정한다.

마지막으로 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;

 

풀이 2 ) 서브쿼리 이용

 

서브쿼리를 이용하는 방법이다.

먼저 Milk를 포함하는 장바구니를 선택한다.

그런 다음, 서브쿼리를 사용하여 Yogurt를 포함하는 장바구니의 ID를 선택한다.

마지막으로 정렬을 적용하면 끝!

 

한 장바구니당 제품 개수를 하나씩만 포함할 것이라고 생각하고 DISTINCT를 쓰지않았는데, 혹시나 하면 CART_ID앞에 DISTINCT를 붙여도 좋을 것 같다.

 

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk' AND CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = 'Yogurt'
)
ORDER BY CART_ID;

 

풀이 3 ) INNER JOIN 이용

 

CART_PRODUCTS를 두번 참조하는 방법이다.

같은 테이블이지만 임의로 cp1, cp2로 칭하겠다. 그 둘을 CART_ID가 같은 것으로 INNER JOIN해준다.

조인된 값들에서 cp1에서는 Milk인것을, cp2에서는 Yogurt인 것을 찾아서 CART_ID로 정렬해준다.

 

위와 마찬가지 이유로 DISTINCT를 안 붙여도 정답처리가 되고 있긴하지만, DISTINCT 처리를 해주었다.

SELECT DISTINCT cp1.CART_ID
FROM CART_PRODUCTS cp1
INNER JOIN CART_PRODUCTS cp2 ON cp1.CART_ID = cp2.CART_ID
WHERE cp1.NAME = 'Milk' AND cp2.NAME = 'Yogurt'
ORDER BY cp1.CART_ID;

 

 

728x90

댓글