https://school.programmers.co.kr/learn/courses/30/lessons/131123
SELECT food_type, rest_id , rest_name, MAX(favorites) AS favorites
FROM rest_info
GROUP BY food_type
ORDER BY food_type DESC
SELECT절에서 max(FAVORITES)를 이용해 정답을 가져왔습니다.
정답 값이 나왔고, 채점 결과는 틀린 것을 나옵니다
이유가 뭘까요?
SQL 고수님의 답변;
" 그 이유는 group by를 food_type으로 진행했을 때 max(favorites)값은 정확히 내가 원하는 foodtype의 favorites라고 확신할 수 있지만 restid, restname은 group by로 묶여지고 제일 첫번째 로우가 가져와지기 때문에 max(favorites)랑 restid, restname이 일치 하지 않을 수 있기 때문입니다. "
그래서 다른 분들은 서브쿼리 또는 join으로 가져오시더군요? 저는 서브쿼리를 이용해 풀어봤습니다.
맨 처음 지정된 쿼리를 가져오는 것은 같습니다.
SELECT food_type, rest_id , rest_name, favorites
FROM rest_info
그다음 지정된 쿼리 food_type, rest_id , rest_name, favorites 을 불러 올 건데, 그 중에서도 음식 종류별 즐겨찾기 수가 가장 많은 식당을 가져올 것이다 WHERE절에서 서브쿼리로 지정해줘야하는데요!
IN은 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건을 의미합니다.
MAX로 즐겨찾기가 가장 많은 순을 불러오고, GROUP BY로 한 지정해 줘야 음식별로 즐겨찾기 수를 가져올수 있습니다.
서브 쿼리에서 GROUP BY 사용 하지 않았을 때
서브 쿼리에서 GROUP BY 사용했을 때
WHERE favorites IN(SELECT MAX(favorites) FROM rest_info GROUP BY food_type)
위에 데이터를 보면 한식 데이터가 2번 나오는 것을 볼 수 있습니다.
OR 조건으로
그룹별로 가장 많은 즐겨찾기 수와 그리고 가장 많은 즐겨찾기 수에 같은 값인 테이블이 같이 불러온건데요!
한가지 데이터만 가져오기 위해 다시 food_type로 묶어 줘야합니다.
GROUP BY food_type
마지막으로 food_type 별로 내림차순 정렬해주면 정답입니다.
ORDER BY food_type DESC
정답
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