테이블에 대한 설명과 문제가 나와있습니다. 문제를 풀면서 'GROUP_CONCAT'과 'INTERSECT'를 공부해 볼게요.
첫 번째, 'GROUP_CONCAT' 활용 과정
SELECT CART_ID, NAME FROM CART_PRODUCTS;
우선 전체적인 테이블 결과를 보기 위해 기본 쿼리를 작성하면, 아래처럼 기본 형태가 나오게 돼요.
이제 여기서 장바구니 (CART_ID)에 'MILK'와 'YOGURT'를 동시에 담은 사람을 출력하면 됩니다.
그래서 첫 번째로 든 접근 방법은 NAME을 GROUP_CONCAT해서 묶어주는 거예요.
GROUP_CONCAT에 대한 자세한 설명은 아래 링크를 통해 알 수 있어요.
SELECT CART_ID, GROUP_CONCAT(NAME) AS NAME
FROM CART_PRODUCTS
GROUP BY CART_ID;
그러면 아래와 같은 형태가 출력되게 됩니다. 그 다음은 해당 테이블을 서브쿼리로 활용한 뒤, WHERE LIKE로 조건을 주면 끝이겠죠?
'GROUP_CONCAT' 최종 쿼리문
SELECT CART_ID
FROM (SELECT CART_ID, GROUP_CONCAT(NAME) AS NAME
FROM CART_PRODUCTS
GROUP BY CART_ID) AS GROUP_ID
WHERE NAME LIKE '%MILK%' AND NAME LIKE '%YOGURT%';
두 번째, 'INTERSECT' 활용 과정 및 자세한 설명
저는 항상 문제를 풀면 다른 사람의 풀이 과정도 함께 보는 편이에요. 그러다 'INTERSECT'에 대해서 처음 알게 되었어요.
원래 MYSQL에서 INTERSECT는 지원되지 않았는데 8.0.31부터 추가가 됐다고 해요 !
INTERSECT를 간략하게 설명하자면, INNER JOIN과 비슷해요 !
1. 두 개 이상의 SELECT 문의 공통된 결과를 반환
2. 두 테이블에서 공통으로 갖는 행만 결합하고 중복은 생략
아래는 INTERSECT를 활용한 최종 쿼리문이에요.
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk'
INTERSECT
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt'
쿼리문에 대한 자세한 설명을 덧붙이자면, 원본 테이블을 보면 CART_ID는 중복되어 있어요.
첫 번째 SELECT에서는 WHERE 조건문으로 'Milk'만 뽑았고, 두 번째 SELECT에서는 'Yogurt'만 뽑았어요.
각각의 결과를 좀 볼까요?
-- 첫 번재, Milk를 장바구니에 담은 CART_ID 출력
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk'
-- 두 번째, 'Yogurt'를 장바구니에 담은 CART_ID 출력
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt'
그리고 ! 두 SELECT 사이에 'INTERSECT' 연산자를 넣어주면,
두 결괏값에서 공통적으로 존재하는 CART_ID만 추출되게 되는 거예요.
'INTERSECT' 최종 결과
이렇게 두 가지 방법을 통해 문제를 풀어봤어요! 아래 프로그래머스 문제 링크를 달아둘게요. 감사합니다 : )
https://school.programmers.co.kr/learn/courses/30/lessons/62284?language=mysql