SQL

[프로그래머스] [MySQL] [LV.4] 우유와 요거트가 담긴 장바구니

석원님 2024. 1. 15. 16:42

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

데이터 분석 팀에서는 우유와 요거트를 동시에 구입한 장바구니가 있는지 알아보려 한다.

우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL문을 작성하라는 문제!

SELECT *
FROM CART_PRODUCTS
WHERE 1=1
    AND NAME = 'MILK'
    AND NAME = 'YOGURT

처음에 그냥 바로 요거를 생각했는데 역시나 오답.

레벨 4가 이렇게 쉬울리 없지,,

서브쿼리로 해봤는데도 도통 모르겠어서 질문하기에서 다른사람들이 어떻게 풀었는지 찾아보았다.

GROUP_CONCAT이라는 함수와 정규표현식(REGEXP)을 이용해서 풀었더라

GROUP_CONCAT

예를 들어 음식 테이블이 있다고 생각해 보자

SELECT *
FROM FOOD

 

결과

TYPE NAME
fruit 수박
fruit 사과
fruit 바나나
fruit 사과

 

 

 

GROUP_CONCAT 사용

SELECT TYPE, GROUP_CONCAT(NAME)
FROM FOOD
GROUP BY TYPE

 

결과

TYPE NAME
fruit 수박, 사과, 바나나, 사과

 

요래된다!

 

굿인걸?

 

 

구분자

이 GROUP_CONCAT을 사용하면 기본적으로 문자열 사이에 쉼표(,)가 붙는다.

구분자를 변경하고 싶다면 구분자를 추가해주면 된다.

SELECT TYPE, GROUP_CONCAT(NAME SEPERATOR '|')
FROM FOOD
GROUP BY TYPE

 

결과

TYPE NAME
fruit 수박|사과|바나나|사과

 

 

중복제거

문자열의 중복을 제거하고 싶다면?

우리가 잘 아는 DISTINCT를 붙여주면 된다!

SELECT TYPE, GROUP_CONCAT(DISTINCT NAME)
FROM FOOD
GROUP BY TYPE

 

결과

TYPE NAME
fruit 수박, 사과, 바나나

 

 

정규표현식 REGEXP

여기서는 간단하게 우유와 요거트만 찾았으니

''로 찾으면 된다.

SELECT *
FROM CART_PRODUCTS
WHERE 1=1
	AND NAME REGEXP 'MILK'
	AND NAME REGEXP 'YOGURT'

 

 

이제 배운걸 다 합쳐보면

SELECT CART_ID
FROM CART_PRODUCTS
GROUP BY CART_ID
HAVING GROUP_CONCAT(NAME) REGEXP 'MILK'
        AND GROUP_CONCAT(NAME) REGEXP 'YOGURT'
ORDER BY 1

읏 짜

 

뾰로롱 정답~