Programmers 우유와 요거트가 담긴 장바구니
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;