Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 여러 열의 순위(RANK)를 동시에 표시하는 방법

MySQL에서 여러 열의 순위(Rank)를 동시에 표시하는 방법

MySQL에서 여러 열에 대한 순위를 한 번의 쿼리로 구하려면 FIND_IN_SET() 함수를 활용하면 됩니다. 이 방식은 각 열의 값을 내림차순으로 정렬한 문자열을 GROUP_CONCAT()으로 만든 뒤, 해당 값이 그 문자열에서 몇 번째 위치에 있는지 찾아 순위를 계산하는 원리입니다.

예제를 통해 단계별로 살펴보겠습니다.

1. 테이블 생성

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable634 (FirstName varchar(100),Marks int,Age int);
Query OK, 0 rows affected (0.69 sec)

2. 데이터 삽입

INSERT 명령어로 샘플 데이터를 입력합니다.

mysql> insert into DemoTable634 values('John',60,23);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable634 values('Chris',80,21);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable634 values('Robert',70,24);
Query OK, 1 row affected (0.22 sec)

3. 전체 데이터 조회

SELECT 문으로 저장된 레코드를 확인합니다.

mysql> select *from DemoTable634;

실행 결과는 다음과 같습니다.

+-----------+-------+------+
| FirstName | Marks | Age |
+-----------+-------+------+
| John | 60 | 23 |
| Chris | 80 | 21 |
| Robert | 70 | 24 |
+-----------+-------+------+
3 rows in set (0.00 sec)

4. 여러 열의 순위를 구하는 쿼리

이제 점수(Marks)와 나이(Age) 두 열에 대한 순위를 동시에 표시하는 쿼리입니다.

mysql> SELECT FirstName,Marks,Age,
    FIND_IN_SET( Marks,( SELECT GROUP_CONCAT( Marks ORDER BY Marks DESC ) FROM DemoTable634)) AS RankOfMarks,
    FIND_IN_SET(Age,( SELECT GROUP_CONCAT( Age ORDER BY Age DESC ) FROM DemoTable634) ) AS RankOfAge
    FROM DemoTable634;

위 쿼리를 실행하면 점수와 나이를 기준으로 한 순위가 함께 출력됩니다. RankOfMarks는 점수 기준 순위, RankOfAge는 나이 기준 순위를 의미합니다.

+-----------+-------+------+-------------+-----------+
| FirstName | Marks | Age | RankOfMarks | RankOfAge |
+-----------+-------+------+-------------+-----------+
| John | 60 | 23 | 3 | 2 |
| Chris | 80 | 21 | 1 | 3 |
| Robert | 70 | 24 | 2 | 1 |
+-----------+-------+------+-------------+-----------+
3 rows in set (0.01 sec)

쿼리 동작 원리

GROUP_CONCAT(Marks ORDER BY Marks DESC)는 테이블의 모든 점수를 내림차순으로 연결한 문자열(예: '80,70,60')을 생성합니다. 이어서 FIND_IN_SET()이 각 행의 값이 이 문자열에서 몇 번째에 위치하는지 반환하는데, 그 위치 값이 곧 해당 열의 순위가 됩니다. 나이(Age) 열에도 동일한 방식을 적용하면, 별도의 윈도우 함수 없이도 여러 열의 순위를 하나의 쿼리로 손쉽게 얻을 수 있습니다.