MySQL에서 상위 2개 최고 점수를 찾는 방법
각 그룹별로 가장 높은 점수를 구한 뒤 상위 2개의 결과만 조회하려면 집계 함수 MAX()와 GROUP BY, 그리고 ORDER BY DESC를 함께 사용하면 됩니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1383
-> (
-> Id int,
-> PlayerScore int
-> );
Query OK, 0 rows affected (0.90 sec)
테이블에 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 샘플 데이터를 입력합니다.
mysql> insert into DemoTable1383 values(200,78);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1383 values(200,89);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1383 values(200,89);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1383 values(200,87);
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable1383 values(203,97);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1383 values(200,57);
Query OK, 1 row affected (0.17 sec)
저장된 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1383;
실행 결과는 다음과 같습니다.
+------+-------------+
| Id | PlayerScore |
+------+-------------+
| 200 | 78 |
| 200 | 89 |
| 200 | 89 |
| 200 | 87 |
| 203 | 97 |
| 200 | 57 |
+------+-------------+
6 rows in set (0.00 sec)
그룹별 최고 점수 조회 쿼리
다음은 Id별로 그룹화하여 각 그룹의 최고 점수를 구하고, 점수가 높은 순서대로 정렬하는 쿼리입니다.
mysql> select Id,max(PlayerScore) from DemoTable1383 group by Id order by max(PlayerScore) DESC;
실행 결과는 다음과 같습니다.
+------+------------------+
| Id | max(PlayerScore) |
+------+------------------+
| 203 | 97 |
| 200 | 89 |
+------+------------------+
2 rows in set (0.00 sec)
쿼리 동작 원리 설명
이 쿼리가 어떻게 동작하는지 단계별로 살펴보겠습니다.
1. GROUP BY Id: 동일한 Id를 가진 행들을 하나의 그룹으로 묶습니다. 위 예제에서는 Id 200과 Id 203 두 개의 그룹이 생성됩니다.
2. MAX(PlayerScore): 각 그룹 내에서 가장 큰 PlayerScore 값을 반환합니다. Id 200 그룹에서는 78, 89, 89, 87, 57 중 최댓값인 89가 선택되고, Id 203 그룹에서는 97이 선택됩니다.
3. ORDER BY max(PlayerScore) DESC: 계산된 최고 점수를 기준으로 내림차순 정렬하여, 가장 높은 점수부터 차례대로 출력합니다.
결과적으로 Id 203의 97점과 Id 200의 89점이라는 상위 2개의 최고 점수를 얻을 수 있습니다. 만약 그룹 수가 많아 상위 N개만 제한적으로 조회하고 싶다면 쿼리 끝에 LIMIT 2를 추가하면 됩니다.