본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 우유와 요거트가 담긴 장바구니

by kime2 2024. 1. 26.
출처

 

문제

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

문제에 대한 해석

-- 장바구니의 아이디
-- 조건: 우유(Milk)와 요거트(Yogurt)를 동시에 구입
-- 정렬: 아이디

풀이(MYSQL)

select distinct(m.cart_id)
from 
(select cart_id, name
from cart_products
where name like 'Milk')m 
join (select cart_id, name
from cart_products
where name like 'Yogurt') y
on m.cart_id = y.cart_id
order by 1

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 

  1. FROM 절
  • 서브쿼리1: cart_products테이블에서 name에 Milk가 포함된 cart_id, name 데이터
  • 서브쿼리2: cart_products테이블에서 name에 Yogurt가 포함된 cart_id, name 데이터
  • 서브쿼리1과 서브쿼리2를 cart_id를 기준으로 inner join하여 공통된 cart_id의 데이터로부터
  1. SELECT 절: cart_id의 중복없는 값을 조회
  2. ORDER BY 절: cart_id 오름차순
답(name추가) distinct하지 않을 경우 2개씩 조회되는 아이디가 있는데, 이 경우 우유 또는 요거트를 2개 이상 구입할 경우

다른사람 풀이

SELECT CART_ID
FROM (
select CART_ID , group_concat(NAME) AS NAME 
-- 3. 그룹화된 CART_ID와 CART_ID별로 합쳐진 name컬럼의 데이터
from CART_PRODUCTS 
-- 1. CART_PRODUCTS테이블에서
WHERE NAME IN ('Yogurt' , 'MILK') 
-- 4. CART_ID별로 합쳐진 name컬럼에서 'Yogurt' , 'MILK'를 포함하는 데이터 필터링
group by CART_ID ) temp 
-- 2. CART_ID별로 그룹화하여
WHERE NAME LIKE '%Yogurt%' AND NAME LIKE '%MILK%'

 

💡cart_id별로 합쳐진 name 컬럼의 데이터 -> 각 다른 행에 있는 데이터가 같은 행으로 합쳐졌다(group_concat)

 

배운점

  • 조인절의 활용
  • group_concat: 조건에 맞는 값들을 묶어서 출력 가능