프로그래머스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
교집합같은 방식으로 또다르게 구현하는 방식은?
조인은 어떨까?
각 조건에 따라서 뽑은 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
'코딩 테스트' 카테고리의 다른 글
[Python] 코딩테스트 고득점Kit | 해시2- 전화번호 목록 (0) | 2021.05.18 |
---|---|
[Python] 코딩테스트 고득점Kit | 해시1- 완주하지 못한 선수 (0) | 2021.05.15 |
SQL코딩테스트 모든 문제 풀이 완료 (0) | 2021.05.06 |
[Programmers] SQL코딩테스트7 | 헤비유저가 소유한 장소 (0) | 2021.05.06 |
[Programmers] SQL코딩테스트6 | String,Date (0) | 2021.04.07 |
[Programmers] SQL코딩테스트5 | JOIN (0) | 2021.04.06 |