[Tools]/SQL 이것저것

[MySQL] 단일 컬럼 값이 두 개 이상의 속성 값을 갖는 데이터 호출하기

pjw250 2024. 10. 15. 12:09

코딩테스트 연습 - 우유와 요거트가 담긴 장바구니 | 프로그래머스 스쿨 (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 가되어 집계가 되는 것.