[TIL] 5일차 - MySQL

Daehyun·2023년 1월 1일
0

[TIL]

목록 보기
5/6

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.FAVORITESNULL 이라면 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

joinselect문을 통해 group by를 사용하여 FOOD_TYPEFAVORITIES의 최대값을 구해서 새로운 테이블을 만든다. 그 후에 원래의 테이블과 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

0개의 댓글