본문 바로가기
코딩 테스트

[Programmers] SQL코딩테스트8 | 우유와 요거트가 담긴 장바구니

by 카프리썬_ 2021. 5. 6.
728x90

프로그래머스SQL 뽀개기!! 일주일동안 매일 하나의 유형 다 뽀개기! 챌린지!

아래의 문제는 프로그래머스 문제 중 2021-Dev-Matching : 웹 백엔드 개발문제로 직접 푼 내용입니다.

 


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

우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회

이때 결과는 장바구니의 아이디 순

CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블

ID, CART_ID, NAME, PRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가격

 

풀이과정


처음에는 단순하게 

Where name like 'Yogurt' and name like 'Milk'를 생각했다.

 

SELECT CART_ID 
FROM CART_PRODUCTS
WHERE NAME LIKE 'Yogurt' AND NAME LIKE 'Milk'

 

그런데 아웃풋이 아무것도 없었다. 생각해보니 '동시에' 구입한 내용에 해당하지 않는다.  

OR조건으로 둘중에 하나를 가진 값은 찾을 수 있을지 몰라도 AND조건으로는 동시에 구매의 의미가 되지 않는다

 

 

아 그럼 요거트를 구입한 cart-id랑 우유를 구입한 cart-id를 따로 뽑아서 합치면 되려나?

교집합을 생각했다.

 

나의 의도는 이랬다. 교집합 intersect를 쓰는것이다.

SELECT CART_ID
FROM CART_PRODUCTS 
WHERE NAME LIKE 'Milk' 
INTERSECT
SELECT CART_ID
FROM CART_PRODUCTS 
WHERE NAME LIKE 'Yogurt'

하지만, MYSQL은 intersect와 minus연산을 지원하지 않는다.

 

그래서 결국 구글링을 했다

mysql의 교집합(interesct), 차집합(union)대신 사용하는 방법. 근데 쿼리가 보기 별로다.

SELECT C.CART_ID
FROM CART_PRODUCTS C
    INNER JOIN CART_PRODUCTS Y ON Y.CART_ID = C.CART_ID AND Y.NAME LIKE 'Milk'
WHERE C.NAME LIKE 'Yogurt'
ORDER BY C.CART_ID

 

lannstark.tistory.com/46

 

MySQL 교집합과 차집합

MySQL에서는 INTERSECT와 MINUS 연산을 지원하지 않는다. 어떻게 하면 다른 쿼리를 같은 효과를 낼 수 있는지 알아보자..! INTERSECT SELECT emp_no FROM dept_emp WHERE dept_no = 'd001' INTERSECT SELECT emp_n..

lannstark.tistory.com

 

교집합같은 방식으로 또다르게 구현하는 방식은?

조인은 어떨까?

 

각 조건에 따라서 뽑은 select 결과를 지칭하고 join하는 것이다.

어차피 뽑는컬럼도 cart-id니까 가능하다!

SELECT A.CART_ID 
FROM (SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Milk') 
    A INNER JOIN 
    (SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Yogurt') 
    B
ON A.CART_ID =B.CART_ID
ORDER BY A.CART_ID 

보기 너무 그러니까 이렇게 간단하게  JOIN하는 방법도 있다

SELECT A.CART_ID
FROM 
(SELECT CART_ID FROM CART_PRODUCTS WHERE NAME LIKE 'Milk') AS A,
(SELECT CART_ID FROM CART_PRODUCTS WHERE NAME LIKE 'Yogurt') AS B
WHERE A.CART_ID = B.CART_ID
ORDER BY A.CART_ID

그런데 이럴때, 같은 테이블을 가지고 A테이블과 B테이블을 만들기엔 뭔가 비효율적이다.

그래서 이렇게 셀프조인을 할 수 있겠다 싶었다 (06.02 추가)

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

 

또는 다른방법으론 서브쿼리가 있다.

CART-ID를 뽑는데, 조건으로 CART_ID를 찾는 것이다. 

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

 

 

반응형