Skip to content

Programmers: 즐겨찾기가 가장 많은 식당 정보 출력하기

Updated: at 오후 08:06

Table of contents

Open Table of contents

들어가며

해당 문제에서 하기와 같은 SQL Query를 날리면, 아래 표와 같은 결과가 나옵니다.

SELECT food_type, rest_id, rest_name, favorites
FROM rest_info;
food_typerest_idrest_namefavorites
한식00001은돼지식당734
일식00002하이가쯔네112
양식00003따띠따띠뜨102
일식00004스시사카우스230
일식00005코슌스123
양식00006지아스나폴리50
양식00007소마바이65
분식00008애플우스151
한식00009숙성돼지143
한식00010맷돌우리콩감자탕243
한식00011부암갈비150
한식00012만다복10
한식00013은성보쌈10
한식00014동명항생선숯불구이53
중식00015만정20
한식00016오대산산채전문점230
한식00017방화동쭈꾸미마을80
분식00018가나안51
분식00019에버그린130
한식00020신동태550
한식00021강수곱창210
한식00022군자네101
일식00023싹쓰리42
한식00024농실가찹쌀순대12
분식00025별미진10

문제에서 원하는 것은 각 음식 종류 별로 가장 즐겨찾기가 많은 레코드를 보여주라는 것입니다.
일단 제가 제출한 답을 보겠습니다.

SQL Query

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. 일단 Sub Query의 결과는 다음과 같습니다.
MAX(favorites)
734
230
102
151
20
  1. WHERE favorites in "Sub Query 결과"에서 rest_info에 있는 레코드 중에서 favorites 필드 값이 바로 위의 표에 있는 숫자에 있는 값 중에 하나라면, WHERE 조건에 걸려서 필터링됩니다.

  2. 필터링된 레코드들을 food_type으로 GROUP지어 줍니다. (GROUP BY food_type에 의해서)

  3. ORDER BY food_type DESC에 의해, 레코드들을 음식 종류를 기준으로 내림차순 정렬을 합니다.

그런데 2번과 3번 과정에 약간의 논리적인 오류가 있습니다.
속된 말로 뽀록으로 맞은 것이죠.
그 과정을 설명하고 개선된 SQL Query를 설명하겠습니다.

favorites 필드 값이 230인 경우는 두 레코드가 있습니다.

food_typerest_idrest_namefavorites
일식00004스시사카우스230
한식00016오대산산채전문점230

정답 레코드를 한 번 볼까요?

food_typerest_idrest_namefavorites
한식00001은돼지식당734
중식00015만정20
일식00004스시사카우스230
양식00003따띠따띠뜨102
분식00008애플우스151

230이라는 값때문에, 한식은 734234 값을 갖는 레코드 두개가 필터링되었고, 결국 이것 때문에 GROUP BY food_type이라는 쓸데없는 연산이 한 번 더 추가됐습니다.
GROUP BY도 결국 운이 좋게 가장 위에 있는

food_typerest_idrest_namefavorites
한식00001은돼지식당734

레코드를 출력해주어서 정답이 된 거지,

food_typerest_idrest_namefavorites
한식00016오대산산채전문점230

위 레코드가 GROUP BY를 했음에도 출력이 됐다면은 정답처리가 될 수 없었을 것입니다. 그래서 SQL Query를 다음과 같이 변경하면 더 좋은 쿼리문이 될 거 같네요.

SELECT food_type, rest_id, rest_name, favorites
FROM rest_info
WHERE (food_type, favorites) in (
    SELECT food_type, MAX(favorites)
    FROM rest_info
    GROUP BY food_type
)
ORDER BY food_type DESC;

틀린 첫번째 SQL Query

SELECT food_type, rest_id, rest_name, MAX(favorites) as favorites
FROM rest_info
GROUP BY food_type
ORDER BY food_type DESC;

이것은 GROUP BY가 됐을 때, 어떤 레코드가 집계 함수에 파라미터로 들어가 있는 필드이외의 필드들이 어떻게 출력되는지에 대한 이해가 없어서 비롯된 코드입니다.