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
읏 짜
뾰로롱 정답~
'SQL' 카테고리의 다른 글
[HackerRank] [MySQL] Weather Observation Station 15 (0) | 2024.01.12 |
---|---|
[MySQL] MOD 함수로 짝수/홀수 찾기 (0) | 2024.01.11 |
[HackerRank] [MySQL] Advanced Select (0) | 2024.01.11 |
[HackerRank] [MySQL] Weather Observation Station 6 (0) | 2024.01.10 |
[프로그래머스] [MySQL] LV.3 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (CONCAT, SUBQUERY, JOIN) (0) | 2024.01.04 |