Home

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

Link

Tables

erDiagram
	CART_PRODUCTS {
		ID INT
		CART_ID INT PK
		NAME VARCHAR
		PRICE INT
	}
Mermaid
복사

Question

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

DataFlow

동시에 있는 장바구니는 찾는 방법 -> like 두번 사용 하지만... 너무 비효율 적이다. like에서 %앞 뒤로 사용하면 인덱스를 전혀 사용할수가 없다. -> 문제를 해결은 가능하지만... 효과적인 방법이 아니다.

Answer

SELECT CART_ID FROM ( SELECT CART_ID, GROUP_CONCAT(NAME SEPARATOR ',') AS plist FROM CART_PRODUCTS GROUP BY CART_ID ) filter WHERE plist LIKE "%Milk%" AND plist LIKE "%Yogurt%" ORDER BY CART_ID;
SQL
복사
SELECT CART_ID FROM CART_PRODUCTS WHERE NAME IN ('Milk', 'Yogurt') GROUP BY CART_ID HAVING COUNT(DISTINCT NAME) = 2 ORDER BY CART_ID;
SQL
복사
Distinct count를 사용하는 방법
SELECT DISTINCT CART_ID FROM CART_PRODUCTS cp WHERE EXISTS ( SELECT 1 FROM CART_PRODUCTS WHERE CART_ID = cp.CART_ID AND NAME = 'Milk' ) AND EXISTS ( SELECT 1 FROM CART_PRODUCTS WHERE CART_ID = cp.CART_ID AND NAME = 'Yogurt' ) ORDER BY CART_ID;
SQL
복사
EXISTS를 사용하는 방법