MySQL - 프로그래머스 레벨 : 3(2) - ORDER BY '정답률'

먹보·2022년 12월 19일
0
post-thumbnail

1. 없어진 기록 찾기

테이블 설명 :
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

문제 설명 : 천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

SELECT
O.ANIMAL_ID,
O.NAME
FROM ANIMAL_INS I
RIGHT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID

🗒️코멘트 : NULL

2. 조건별로 분류하여 주문상태 출력하기

테이블 설명 :
다음은 식품공장의 주문정보를 담은 FOOD_ORDER 테이블입니다. FOOD_ORDER 테이블은 다음과 같으며 ORDER_ID, PRODUCT_ID, AMOUNT, PRODUCE_DATE, IN_DATE,OUT_DATE,FACTORY_ID, WAREHOUSE_ID는 각각 주문 ID, 제품 ID, 주문양, 생산일자, 입고일자, 출고일자, 공장 ID, 창고 ID를 의미합니다.

문제 설명 : FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.

SELECT
O.ORDER_ID,
O.PRODUCT_ID,
DATE_FORMAT(O.OUT_DATE,"%Y-%m-%d") OUT_DATE,
CASE WHEN DATEDIFF(DATE_FORMAT(O.OUT_DATE,"%Y-%m-%d"),"2022-05-01") <= 0 THEN "출고완료"
WHEN DATEDIFF(DATE_FORMAT(O.OUT_DATE,"%Y-%m-%d"),"2022-05-01") > 0 THEN "출고대기"
ELSE "출고미정"
END AS "출고여부"
FROM FOOD_ORDER O
ORDER BY O.ORDER_ID ASC

🗒️코멘트 : NULL

3. 즐겨찾기가 가장 많은 식당 정보 출력하기

테이블 설명 :
다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

문제 설명 : REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

SELECT 
R.FOOD_TYPE, 
R.REST_ID, 
R.REST_NAME, 
R.FAVORITES
FROM REST_INFO R 
JOIN (
    SELECT 
    FOOD_TYPE, 
    MAX(FAVORITES) AS FAVORITES
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) R2
ON R.FAVORITES = R2.FAVORITES AND R.FOOD_TYPE = R2.FOOD_TYPE 
ORDER BY FOOD_TYPE DESC

🗒️코멘트 : 여태까지 풀었던 MySQL 문제 중에서 가장 어려웠던 문제다...처음에는 단순하게 생각해서 그냥 GROUP BY로 묶어버리면 되겠지라고 생각했는데 계속 오답처리가 나서 SELECT * FROM TABLE로 데이터를 다 뜯어본 결과 단순한 GROUP BY 문제로 풀을 시 MAX로 설정한 FAVORITE과 GROUP BY로 묶은 FOOD_TYPE은 제대로 갖고 오지만 그 외 값들이 제대로 반영되지 않아 오류를 냈던 것이다. 앞으로 GROUP BY로 묶을 때 다른 값들도 명확하게 같이 주제별로 묶을 수 있는 지 확인해봐야 될 것 같다.

📌총평 :

프로그래머스에 MySQL 문제가 많이 없다보니 이제 레벨 3도 거의 동이 났다. 하지만 확실히 쿼리에 대한 개념을 깔끔하게 짚고 넘어가는 부분이 좋은 것 같다. 이제 LV.5까지 15문제만 남았다..과연 LV.5까지 순조롭게 풀 수 있을지는 모르겠지만 이걸 끝을 봐야지 ORM을 제대로 시작할 수 있을 것 같다.

가즈아!!

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글