[SQL] 프로그래머스 48번 : 즐겨찾기가 가장 많은 식당 정보 출력하기(GROUP BY | 중첩 SUB QUERY | 튜플 | JOIN | WITH 문)

프로그래머스 48번. 즐겨찾기가 가장 많은 식당 정보 출력하기

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


`🙋🏻‍♂️ 처음 시도했던 쿼리문(오답)`

SELECT food_type
        , rest_id
        , rest_name
        , MAX(favorites) AS favorites
FROM rest_info
GROUP BY food_type 
ORDER BY food_type DESC
;

출력값은 나오지만, 틀렸다는 대답뿐...유유

 

 

`🥹 문제점`

알고보니 rest_name = '하이가쯔네' 의 favorites 이 112 임을 확인했다. 그런데 왜 '하이가쯔네' 식당에 favorites 230이 딸려왔을까?

 

 

`🧐 고민해 본 결과`

작동 순서에 따라 발생한 잘못된 그룹화? 정답이 될 수도 있지만 그룹화가 잘못될 가능성이 훨씬 높다.

food_type 별 favorites 을 가져오는 과정에서 select 절에 rest_id, rest_name 까지 있어서 발생할 수 있는 문제이다.

작동순서는 아래와 같다.
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
이에 따라, GROUP BY 가 적용된 후 SELECT를 하기에 원하는 food_type별 rest_id, rest_name이 덮어씌워질 수 있다.

 

 

`🔍구글링 하고 시도했던 쿼리문(정답)`

SELECT food_type
        , rest_id
        , rest_name
        , favorites
FROM rest_info
WHERE favorites IN (SELECT MAX(favorites)
                    FROM rest_info
                    GROUP BY food_type)
GROUP BY food_type
ORDER BY food_type DESC
;

 

 

`📈 또 다른 풀이들 `

1. 튜플을 사용한 쿼리

SELECT FOOD_TYPE
		, REST_ID
        , REST_NAME
        , FAVORITES
FROM REST_INFO
WHERE (FITEOOD_TYPE, FAVORS) IN (
    SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
;

 

2. JOIN을 사용한 쿼리

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

 

3. WITH 문을 사용한 쿼리

WITH max_favs AS (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS MAX_FAV
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) 
SELECT R.FOOD_TYPE, R.REST_ID, R.REST_NAME, R.FAVORITES
FROM REST_INFO R
JOIN max_favs M
  ON R.FOOD_TYPE = M.FOOD_TYPE AND R.FAVORITES = M.MAX_FAV
ORDER BY R.FOOD_TYPE DESC
;

모두 동일한 결과(정답)값이 나온다!!!

이번 문제와 비슷한 문제를 풀 때
오늘 배운 방법들을 적용시켜 봐야겠다.
SQL아!!

나 지금 되게 신나 😏

되게 신남

프로그래머스 49번. 식품분류별 가장 비싼 제품의 정보 조회하기

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

동일한 유형의 문제이다. 튜플 방식을 사용 후 정답!

JOIN 과 WITH 문도 사용해보자!!