IT 직군을 준비하다 보니 코딩테스트에서 mysql을 사용하는 경우도 있어서 mysql 공부도 조금씩 하고 있다.
쉬운 문제들은 괜찮았지만 점점 난이도가 높아지고 있다보니 정리의 필요성이 느껴졌다.
이번에는 두 개 이상의 조건이 있어서 이들을 조회하는 경우를 정리해보았다.
이 문제에서는 음식의 종류별로 구분하고 그 안에서 즐겨찾기 수가 가장 많은 식당을 조회하는 문제였다. 처음에는 select문을 두 번 사용하지 않고 구하는 방법을 고민했다.
SELECT a.FOOD_TYPE, a.REST_ID, a.REST_NAME, a.FAVORITES
from REST_INFO a
left join REST_INFO b
on a.FOOD_TYPE = b.FOOD_TYPE AND a.FAVORITES < b.FAVORITES
where b.FOOD_TYPE IS null
order by a.FOOD_TYPE desc
같은 테이블을 join하여 on에서 음식의 타입FOOD_TYPE
이 같은 것들 중 즐겨찾기 수FAVORITES
가 가장 많은 것을 골라내었다.
b.FAVORITES
가 NULL
이라면 a.FAVORITES
가 최대값이기 때문에 최대값을 가진 row값을 추출을 할수가 있다.
where은 a테이블에서 값을 찾게 한다.
해당 방법이 가장 처음 시도한 방법이었다. 결과는 통과였지만 문제에서는 group by
를 요구하는 문제였기 때문에 group by
를 사용하는 방법을 다시 고민해보았다. 나머지 두가지 방법은 select
문을 두번 사용하는 방법이다.
먼저 join을 사용하여 구하는 방식이다. 위의 방식과 유사하나 최대값을 구하는 부분이 select
를 통해 해결된다.
SELECT a.FOOD_TYPE, a.REST_ID, a.REST_NAME, a.FAVORITES
from REST_INFO a
join (
SELECT FOOD_TYPE, Max(FAVORITES) as FAVORITES
from REST_INFO
group by FOOD_TYPE
) b
on a.FOOD_TYPE = b.FOOD_TYPE AND a.FAVORITES = b.FAVORITES
order by a.FOOD_TYPE desc
join
의 select
문을 통해 group by
를 사용하여 FOOD_TYPE
별 FAVORITIES
의 최대값을 구해서 새로운 테이블을 만든다. 그 후에 원래의 테이블과 join
하여 필요한 튜플을 구해준다.
마지막 방법은 where
에서 in
을 사용하여 구하는 방법이다.
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
join
을 사용하지 않고 group by
를 두 번 사용한다.
쉬운듯 쉽지 않은 복잡한 mysql이다. 공부를 많이 해야할 것 같다!
https://helloino.tistory.com/120
https://yoo-hyeok.tistory.com/98