코딩테스트 연습 - 우유와 요거트가 담긴 장바구니 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
CART_ID 에 담긴 여러 품목들의 정보가 있는 CART_PRODUCTS 테이블에서 CART에 MILK와 YOGURT가 담긴 카트만을 추출해야한다.
[ 내가 풀었던 방법 (아래)]
SELECT M.CART_ID
FROM (SELECT CART_ID FROM CART_PRODUCTS
WHERE NAME = 'Milk') M
JOIN (SELECT CART_ID FROM CART_PRODUCTS
WHERE NAME = 'Yogurt') Y
USING (CART_ID)
ORDER BY 1
> 이땐 단순히 1:1 매칭을 생각했다. 즉, 한개의 테이블에 MILK가 담긴 CART_ID를 호출 하고 다른 테이블에 YOGURT가 담긴 CART_ID를 호출해서 INNER JOIN하면서 CART_ID를 호출 하면 끝... 즉 교집합을 이용했다.
> 다만, 좀더 생각을 해보면 아래와 같은 쿼리로 완성시킬 수 있다.
[ 참고하였던 쿼리문 (아래)]
SELECT CART_ID
FROM (SELECT CART_ID
FROM CART_PRODUCTS
GROUP BY CART_ID, NAME
HAVING NAME REGEXP 'Milk|Yogurt') AS S
GROUP BY CART_ID
HAVING COUNT(CART_ID) = 2
> 이 쿼리문을 보고 감탄을 금치 못 했다.
> 항상 GROUP BY를 1개 속성만 하려는 내를 되돌아 보는 시간, GROUP BY에 CART_ID와 NAME(제품명)을 넣으면서 HAVING으로 MILK 혹은 YOGURT를 갖는 것만 호출한다.
> 그러면 CART 'A'에 MILK, CART'A'에 YOGURT 이렇게 두 줄이 형성되고 만약 MILK 나 YOGURT를 한개 만 갖고 있으면 한줄만 쌓인다.
> 위 결과 테이블을 FROM 서브쿼리로 두고 여기서 CART_ID를 GROUP BY하면서 COUNT(*) = 2 처리 하면 MILK, YOGURT를 같는 CART는 두 줄이라 COUNT = 2 가되어 집계가 되는 것.
'[Tools] > SQL 이것저것' 카테고리의 다른 글
[MySQL] WINDOW FUNTION - RANK, LAG 등 (0) | 2024.10.16 |
---|---|
[MySQL] 자주 쓰는 함수들 - UPDATABLE (0) | 2024.10.16 |
[MySQL] WHERE 절 서브쿼리 (0) | 2024.10.15 |
[MySQL] SQL 라이브 섹션 과제 서브쿼리와 JOIN 마무리 (4) | 2024.10.14 |
[MySQL] YEAR()와 MONTH()를 사용한 DATE TYPE에서 추출 (2) | 2024.10.14 |