728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/62284
- 우유와 요거트를 동시에 구입한 장바구니의 아이디(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
'코딩테스트 > SQL 코드카타' 카테고리의 다른 글
MySQL 프로그래머스 | 헤비 유저가 소유한 장소 (집계함수 없는 GROUP BY절의 결과) (2) | 2024.10.18 |
---|---|
MySQL 프로그래머스 | 멸종 위기의 대장균 찾기 (재귀쿼리로 자식 없는 개체수 구하기) (0) | 2024.10.17 |
MySQL 프로그래머스 | 특정 세대의 대장균 찾기 (재귀쿼리로 자식 세대 구하기) (0) | 2024.10.16 |
MySQL 프로그래머스 | 대장균의 크기에 따라 분류하기 2 (PERCENT_RANK 함수 사용) (1) | 2024.10.11 |
MySQL 프로그래머스 | 부모의 형질을 모두 가지는 대장균 찾기 (비트연산자, IN 활용) (1) | 2024.10.10 |
댓글