DB/SQL

[SQL]프로그래머스 - 즐겨찾기가 가장 많은 식당 정보 출력

journey-dev 2023. 5. 30. 13:44

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/131123

FOOD_TYPE 별 좋아요 수가 젤 많은 행 한건만 출력해야 함.

 


<시도1. group by ~ having 절 사용>
- FOOD_TYPE별로 그룹화 한 후, having에 max 조건을 걸어 좋아요수가 젤 많은 음식점 한건만 출력하려 했음.
- 문제 : 단순히 젤 첫번째 FOOD_TYPE 행만 나오고, max 요건은 따지지 않음.

- 이유

: having은 group by에서 집계한 결과물에서 단순히 filter하는 역할이다. 때문에 max()를 이용해 새로운  연산을 할 수 없다.

: having 뒤에는 조건이 나와야 하는데 이건 단순히 max함수를 실행해서 값을 조회한 것이기 때문에, 이건 조건문이 아니다!

  만일 having max(FAVORITES)> 1000 이런 코드였다면 올바른 조건이기 때문에 유효한 코드가 될 것이다.

 select * from REST_INFO  group by FOOD_TYPE  having(max(FAVORITES))

max조건이 걸리지 않고, 첫번째로 조회되는 REST_NAME이 나온다.


 

<시도2.  그룹화 한 후, 집계함수 max로 행 조회 >

select  * , max(FAVORITES)  from REST_INFO  group by FOOD_TYPE

max함수를 통해 제대로된 조회된 결과

- 기존 테이블과 max값을 조회한 테이블을 조인시키는데, 이때 조인 조건은 두 테이블간 FOOD_TYPE과  FAVORITES가 같아야 한다.

select R.FOOD_TYPE,R.REST_ID,R.REST_NAME,R.FAVORITES 
from REST_INFO R 
join (select FOOD_TYPE, max(FAVORITES) as maxFav 
	  from REST_INFO 
      group by FOOD_TYPE) T
	  on R.FOOD_TYPE = T.FOOD_TYPE and R.FAVORITES = T.maxFav
order by R.FOOD_TYPE desc

 


참고자료

 

https://www.inflearn.com/questions/161097/having-%EC%A0%88%EC%97%90-max-%EC%82%AC%EC%9A%A9-%EA%B2%B0%EA%B3%BC%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%A7%88%EB%AC%B8

 

https://helloino.tistory.com/120