본문 바로가기
알고리즘/SQL

SQL(MYSQL) / 프로그래머스 : 우유와 요거트가 담긴 장바구니

by clean_h 2022. 2. 4.
728x90

프로그래머스 : 우유와 요거트가 담긴 장바구니

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) - MILK 테이블 

SELECT A.CART_ID
FROM
(SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'MilK') AS A JOIN
(SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Yogurt') AS B
WHERE A.CART_ID = B.CART_ID
ORDER BY CART_ID

Milk가 존재하는 테이블과 Yogurt가 존재하는 테이블을 CART_PRODUCTS에서 뽑아낸 후 JOIN하여 CART_ID가 같은 교집합 부분만 조회한다. 

 

 

🎨 코드(2)

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

서브 쿼리문을 사용하여 구하였다.

WHERE 조건에 서브 쿼리에서 Milk가 존재하는 CART_ID 칼럼을 구하여 조건에 만족하는 경우를 출력할 수 있다.

 

 

🎨 코드(3)

SELECT A.CART_ID
FROM CART_PRODUCTS AS A JOIN CART_PRODUCTS AS B
ON A.CART_ID = B.CART_ID
WHERE A.NAME = 'Milk' AND B.NAME = 'Yogurt'
ORDER BY A.CART_ID

(1)번 방법과 비슷하다.

FROM에서 같은 테이블 두개를 JOIN한 후 A에서는 Milk만 B에서는 Yogurt만 존재하는 테이블을 구하여 같은 부분만 출력할 수 있다.

 

 

 

정리

세 개의 코드 모두 테이블 두 개를 사용하거나 서브 쿼리문을 사용하는 문제이다. 

 

셀프 조인으로 Milk나 Yogurt가 존재하는 칼럼을 찾아서 조회하거나 

서브쿼리문을 사용하여 문제를 해결할 수 있다. 

 

 

 

 

 

728x90

댓글