MySQL 프로그래머스 | 우유와 요거트가 담긴 장바구니 (GROUP_CONCAT, LIKE문 풀이 / IN함수 풀이 / 셀프조인 풀이)

728x90

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/62284

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 우유와 요거트를 동시에 구입한 장바구니의 아이디(CART_ID)를 조회하는 SQL 문 작성
  • 결과는 장바구니 아이디 기준 오름차순 정렬

 

테이블

CART_PRODUCTS

 

 

풀이과정

▶ GROUP_CONCAT 함수와 LIKE문 사용 정답

 

# GROUP_CONCAT, LIKE 함수 사용

  • 장바구니 아이디(CART_ID) 별로 그룹을 만들어서 장바구니 내용물 이름(NAME)을 GROUP_CONCAT 해버림
    그러면 한 CART_ID에 해당하는 NAME들이 모두 구분자로 연결됨
  • 이후 LIKE문을 사용해 NAME 안에 'Milk'와 'Yogurt'가 있는 행만 필터링함
    이 때 'Milk'나 'Yogurt'가 나열된 장바구니 내용물 이름들 중 어디에 있을지 모르니 양쪽에 %를 붙여줌 
1
2
3
4
SELECT CART_ID, GROUP_CONCAT(NAME) GN
FROM CART_PRODUCTS
GROUP BY CART_ID
HAVING  GN LIKE('%Milk%') AND GN LIKE('%Yogurt%')
cs

 

#  정답

  • SELECT문에 CART_ID만 조회해주기
  • CART_ID 기준 오름차순 정렬까지 해주면 끝!
1
2
3
4
5
6
7
SELECT CART_ID
FROM
(SELECT CART_ID, GROUP_CONCAT(NAME) GN
FROM CART_PRODUCTS
GROUP BY CART_ID
HAVING  GN LIKE('%Milk%') AND GN LIKE('%Yogurt%')) G
ORDER BY CART_ID
cs

 

 

다른 사람 풀이 참고

▶ IN함수 사용 정답

 

# IN 함수로 'Yogurt'가 있는 CART_ID만 일단 선별

  • 장바구니 내용물에 'Yogurt'가 들어있는 CART_ID만 IN함수로 필터링 
  • 만약 IN 함수 내 서브쿼리 WHERE절에
    NAME = 'Yogurt'인 경우와 NAME = 'Milk'인 경우를 모두 조건으로 주게 되면, 결과가 안 나옴.
    왜냐하면 하단 사진처럼 하나의 장바구니(CART_ID)에는 장바구니 내용물 이름(NAME)이 여러 행에 각각 있기 때문에 NAME이 요거트이면서 우유인 조건을 동시에 만족하는 행은 없기 때문!
1
2
3
4
5
6
SELECT *
FROM CART_PRODUCTS
WHERE CART_ID IN (SELECT CART_ID
                  FROM CART_PRODUCTS cp
                  WHERE NAME = 'Yogurt' )
ORDER BY CART_ID
cs

 

 

# 'Milk' 까지 있는 CART_ID 선별

1
2
3
4
5
6
7
SELECT *
FROM CART_PRODUCTS
WHERE CART_ID IN (SELECT CART_ID
                  FROM CART_PRODUCTS cp
                  WHERE NAME = 'Yogurt' )
AND NAME = 'Milk' 
ORDER BY CART_ID
cs

 

# 정답

  • 문제에서 요구한대로 CART_ID만 조회해주면 끝!
1
2
3
4
5
6
7
SELECT CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN (SELECT CART_ID
                  FROM CART_PRODUCTS cp
                  WHERE NAME = 'Yogurt' )
AND NAME = 'Milk' 
ORDER BY CART_ID
cs

 

 

▶ 셀프조인 사용 정답

# 셀프조인 시 조건을 구체화하기

  • 조인 조건에 NAME이 'Milk'이면서 'Yogurt'인 경우에만 서로 INNER JOIN 되도록 함
  • 그 후 CART_ID를 중복없이 뽑으면 끝..!
1
2
3
4
5
SELECT DISTINCT C1.CART_ID
FROM CART_PRODUCTS C1
JOIN CART_PRODUCTS C2 ON C1.CART_ID = C2.CART_ID
WHERE C1.NAME = 'Milk' AND C2.NAME = 'Yogurt'
ORDER BY C1.CART_ID
cs

 

 

 

728x90

댓글