https://school.programmers.co.kr/learn/courses/30/lessons/62284
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[문제]
데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.
[나의 풀이]
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('YOGURT', 'MILK')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY 1;
[다른 풀이]
1)
WITH M AS (SELECT DISTINCT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME = 'Milk')
, Y AS (SELECT DISTINCT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt')
SELECT Y.CART_ID
FROM Y
INNER JOIN M
ON Y.CART_ID = M.CART_ID
ORDER BY Y.CART_ID
2)
SELECT CART_ID
FROM (
SELECT CART_ID, GROUP_CONCAT(NAME) AS NAMES
FROM CART_PRODUCTS
GROUP BY CART_ID
) TMP
WHERE NAMES LIKE '%Milk%'
AND NAMES LIKE '%Yogurt%'
만약 NAMES까지 같이 SELECT하게 된다면?
SELECT CART_ID, NAMES
FROM (
SELECT CART_ID, GROUP_CONCAT(NAME) AS NAMES
FROM CART_PRODUCTS
GROUP BY CART_ID
) TMP
WHERE NAMES LIKE '%Milk%'
AND NAMES LIKE '%Yogurt%'
이런 식으로 끝도 없이 나옴
*TIP) GROUP_CONCAT(DISTINCT NAME)하면 중복되는 값 한 번만 나옴
SELECT CART_ID, NAMES
FROM (
SELECT CART_ID, GROUP_CONCAT(DISTINCT NAME) AS NAMES
FROM CART_PRODUCTS
GROUP BY CART_ID
) TMP
WHERE NAMES LIKE '%Milk%'
AND NAMES LIKE '%Yogurt%'
-참고
[프로그래머스][MySQL]우유와 요거트가 담긴 장바구니(Summer/Winter Coding(2019) )
CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. CART_PRODUCTS 테이블의 구조는 다음과 같으며, ID, CART_ID, NAME, PRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가
velog.io
3)
SELECT CART_ID
FROM CART_PRODUCTS
GROUP BY CART_ID
HAVING SUM(CASE WHEN NAME = 'Milk' THEN 1 ELSE 0 END) >= 1
AND SUM(CASE WHEN NAME = 'Yogurt' THEN 1 ELSE 0 END) >= 1
ORDER BY CART_ID;
'프로그래머스 > My SQL' 카테고리의 다른 글
5월 식품들의 총매출 조회하기 (0) | 2024.12.18 |
---|---|
💫식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.12.17 |
💫입양 시각 구하기(2) (0) | 2024.12.15 |
보호소에서 중성화한 동물 (0) | 2024.12.14 |
💫대장균의 크기에 따라 분류하기 2 (0) | 2024.12.13 |