반응형
반응형

출저 : 프로그래머스

SELECT

문제풀이

 

A. JOIN 사용

SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY FROM ITEM_INFO AS A 
LEFT JOIN ITEM_TREE AS B ON A.ITEM_ID = B.PARENT_ITEM_ID
WHERE B.ITEM_ID IS NULL
ORDER BY A.ITEM_ID DESC

 


     

    N차세대 부모-자식관련 문제를 풀 땐 조인을 이용하여 생각해야한다. 그리고 이 문제는 문제에 두 테이블은 분리가 되어있는 것 처럼 보이지만 PARENT_ITEM_ID만 따로 분리했다고도 볼 수 있다. 그래서 어떻게 결합하냐에 따라 문제를 보다 쉽게 해석할 수 있게된다.

     

    처음에 ITEM_ID 는 자식, PARENT_ITEM_ID 는 부모를 의미하고있다.

    그렇다면 테이블 두개를 ON A.ID = B.PARENT_ITEM_ID 로 결합하게 된다면 부모-자식간 관계가 보인다

     

    두 테이블을 ON A.ID = B.PARENT_ITEM_ID 로 결합했을 경우

    좌측 A. ITEM_ID B.PARENT_ID 부모포지션으로 같아지고  

    B.PARENT_ID의 자식 B. ITEM_ID A. ITEM_ID의 자식으로 볼 수 있다.

     

    즉  아래와 같은 테이블로 볼 수 있다

     

    이 이후엔 업그레이드가 불가능한 조건 ( = 자식이 없는 부모, WHERE B.ITEM_ID IS NULL )을 구하면 된다

     

     

     

     

    아래문제는 비슷한 유형이므로 연계해서 풀어보면 도움이 될 것 같다.

    [프로그래머스/MYSQL] 대장균들의 자식의 수 구하기 :: 공기업 전산직을 위한 도서관

    반응형
    반응형

    ㅇ출저 : 프로그래머스

    SELECT

    문제풀이

     

    A. JOIN 사용

    SELECT A.ID, COUNT(B.ID) AS CHILD_COUNT FROM ECOLI_DATA AS A
    LEFT JOIN ECOLI_DATA AS B ON A.ID = B.PARENT_ID
    GROUP BY A.ID
    ORDER BY A.ID

     


       

      N차세대 자식수를 구할 땐 조인을 이용하여 생각해야한다 

      처음에 ID는 자식, PARENT_ID 는 부모를 의미하고있는데 문제에서 자식의 수를 구해야하므로  저 두 행 위치가 서로 바뀌어 정렬되어야한다. 그래서 JOIN을 할때 ON A.ID = B.PARENT_ID  을 하여 비교하면 쉽게 눈에 보인다

       

      좌측은 기본테이블 / 우측에 붙은테이블은 B.ID(자식), B.PARENT_ID(부모)로, 한눈에 파악하기위해 조인함 처

      조인할 당시 ON A.ID = B.PARENT_ID 로 조인을 했기때문에 좌측 A.IDB.PARENT_ID 부모 포지션으로 같아지고  

      B.PARENT_ID의 자식 B.IDA.ID의 자식으로 볼 수 있다

       

      즉  아래와 같은 테이블로 볼 수 있다

       

       

      그래서 GROUP BY 와 COUNT를 이용하여 결과를 출력할 수 있다. 

      (단 COUNT에서 COUNT(B.PARENT_ID) 를 입력해도 결과는 같지만 출력되는 테이블은 다르므로 유의)

       

       

       

       

      아래문제는 비슷한 유형이므로 연계해서 풀어보면 도움이 될 것 같다.

      [프로그래머스/MYSQL] 업그레이드 할 수 없는 아이템 구하기 :: 공기업 전산직을 위한 도서관

      반응형
      반응형

      출저 : 프로그래머스

       

      JOIN

      문제풀이

       

      1. REST_REVIEW  테이블에서 ID별 개수 뽑기

      SELECT MEMBER_ID, COUNT(MEMBER_ID) AS CMI FROM REST_REVIEW 
      GROUP BY MEMBER_ID

       

      2. REST_REVIEW  테이블과 ID별 개수뽑은 테이블 결합

      SELECT C.MEMBER_NAME, A.REVIEW_TEXT, A.REVIEW_DATE, A.MEMBER_ID, B.CMI FROM REST_REVIEW AS A
      LEFT JOIN

               (SELECT MEMBER_ID, COUNT(MEMBER_ID) AS CMI FROM REST_REVIEW GROUP BY MEMBER_ID ) 

      AS B ON A.MEMBER_ID = B.MEMBER_ID

       

      ※ SELECT에서 선택한 컬럼명은 제가 보고싶은 컬럼명들만 선별했음, 본인에 따라 바꾸기

       

       

      3. MEMBER_PROFILE 테이블과 추가 결합

      SELECT C.MEMBER_NAME, A.REVIEW_TEXT, A.REVIEW_DATE, A.MEMBER_ID, B.CMI FROM REST_REVIEW AS A

      LEFT JOIN 

               (SELECT MEMBER_ID, COUNT(MEMBER_ID) AS CMI FROM REST_REVIEW GROUP BY MEMBER_ID )

                AS B ON A.MEMBER_ID = B.MEMBER_ID

      RIGHT JOIN MEMBER_PROFILE AS C ON A.MEMBER_ID = C.MEMBER_ID

       

      ※ LEFT로 조인 시 MEMBER_PROFILE 에 이름이 없는 칸이 존재, RIGHT 로 공백 없앰

       

      4. WITH 함수를 사용하여 중간결과 확인

      WITH RSS AS 

                (SELECT C.MEMBER_NAME, A.REVIEW_TEXT, A.REVIEW_DATE, A.MEMBER_ID, B.CMI 

                 FROM REST_REVIEW AS A
      LEFT JOIN

                (SELECT MEMBER_ID, COUNT(MEMBER_ID) AS CMI FROM REST_REVIEW GROUP BY MEMBER_ID ) 

                 AS B ON A.MEMBER_ID = B.MEMBER_ID
      RIGHT JOIN MEMBER_PROFILE AS C ON A.MEMBER_ID = C.MEMBER_ID )
      SELECT * FROM RSS

       

       

      5. 조건에 맞게 출력( 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들 ), WHERE로 MAX 값 설정

      WITH RSS AS 

                (SELECT C.MEMBER_NAME, A.REVIEW_TEXT, A.REVIEW_DATE, A.MEMBER_ID, B.CMI 

                 FROM REST_REVIEW AS A
      LEFT JOIN

                (SELECT MEMBER_ID, COUNT(MEMBER_ID) AS CMI FROM REST_REVIEW GROUP BY MEMBER_ID ) 

                 AS B ON A.MEMBER_ID = B.MEMBER_ID
      RIGHT JOIN MEMBER_PROFILE AS C ON A.MEMBER_ID = C.MEMBER_ID )


      SELECT MEMBER_NAME, REVIEW_TEXT, 

      DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE FROM RSS
      WHERE CMI = (SELECT MAX(CMI) FROM RSS)
      ORDER BY REVIEW_DATE, REVIEW_TEXT

       

       

       

      WITH 테이블 중간중간에 들어간 컬럼 및 AS(별칭)은 제가 보기에 편한걸로 임의작성한거('RSS, CMI 등) 그래서 작성에 영향은 없음

       

      요즘 WITH로 테이블을 하나 새로 구축 후 SELECT으로 결과 뽑는 것이 문제풀기에 더 수월한 것 같다 가독성도 무너가 높아지는 것 같고..

       

      반응형

      + Recent posts

      // 기업0 D-Day (표지) // 기업1 D-Day