SQL

Programmers 우유와 요거트가 담긴 장바구니

sara2601 2021. 9. 5. 06:30

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

 

코딩테스트 연습 - 우유와 요거트가 담긴 장바구니

CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. CART_PRODUCTS 테이블의 구조는 다음과 같으며, ID, CART_ID, NAME, PRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가

programmers.co.kr

데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.


방법1. GROUP_CONCAT 함수를 사용해 'Milk, Yogurt' 라는 문자열을 가진 cart_id를 구함.

 

GROUP BY를 통해 각 cart_id마다 구매한 상품명을 unique하게 알파벳순서대로 ',' 기준으로 합친 뒤에, 'Milk, Yogurt' 문자열에 해당하는 cart_id만 뽑아내서 사용한다는 아이디어

SELECT DISTINCT CART_ID FROM CART_PRODUCTS
WHERE CART_ID in (SELECT CART_ID FROM CART_PRODUCTS
                  WHERE NAME in ('Yogurt', 'Milk')
                  GROUP BY CART_ID
                  HAVING GROUP_CONCAT(DISTINCT NAME Order by NAME) = 'Milk,Yogurt')
ORDER BY CART_ID;

 

* GROUP_CONCAT(Type) : 

GROUP BY Type이라고 하면 각 개체가 가지고 있는 Type값을 문자열로 합쳐줌.

GROUP_CONCAT(DISTINCT Type)으로 하면 중복되는 obs지운 채로 합칠 수 있음.

 

방법2. INNER JOIN을 활용

milk를 구매한 cart_id와 yogurt를 구매한 cart_id를 distinct하게 뽑아 이를 inner join함으로써 둘다 구매한 cart id만 남기는 방법. 

SELECT DISTINCT A.CART_ID 
FROM (SELECT DISTINCT CART_ID FROM CART_PRODUCTS WHERE NAME = "Yogurt") AS A
INNER JOIN (SELECT DISTINCT CART_ID FROM CART_PRODUCTS WHERE Name = 'Milk') AS B
ON A.CART_ID = B.CART_ID;