MySQL 프로그래머스 | 우유와 요거트가 담긴 장바구니 (GROUP_CONCAT, LIKE문 풀이 / IN함수 풀이 / 셀프조인 풀이)

    728x90

     

    문제

    https://school.programmers.co.kr/learn/courses/30/lessons/62284

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    • 우유와 요거트를 동시에 구입한 장바구니의 아이디(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

    댓글