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아!! 나 지금 되게 신나 😏