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

MySQL에서 LIMIT 적용 후 다른 컬럼으로 재정렬하는 방법

MySQL에서 LIMIT으로 행을 제한한 뒤, 다른 컬럼을 기준으로 다시 정렬하고 싶다면 서브쿼리(subquery)를 활용해야 합니다. 핵심은 SELECT 문을 두 겹으로 구성하는 것입니다. 내부 SELECT가 먼저 특정 컬럼을 기준으로 내림차순 정렬 후 원하는 개수만큼 행을 제한(LIMIT)하여 반환하고, 외부 SELECT가 그 결과를 다른 컬럼을 기준으로 오름차순으로 최종 정렬합니다.

기본 문법

SELECT * FROM
(
    SELECT * FROM yourTableName 
    ORDER BY yourColumnName1 DESC 
    LIMIT 9
) AS anyAliasName
ORDER BY yourColumnName2;

위 문법을 이해하기 위해 실제 예제 테이블을 만들어 단계별로 살펴보겠습니다.

1. 테이블 생성

먼저 사용자 정보를 저장할 테이블을 생성합니다.

mysql> create table OrderByAfterLimit
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> UserName varchar(20),
    -> UserAge int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.69 sec)

2. 데이터 삽입

INSERT 명령어로 샘플 레코드를 추가합니다.

mysql> insert into OrderByAfterLimit(UserName, UserAge) values('John',23);
Query OK, 1 row affected (0.24 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Larry',21);
Query OK, 1 row affected (0.36 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Bob',26);
Query OK, 1 row affected (0.19 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('James',22);
Query OK, 1 row affected (0.18 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Robert',28);
Query OK, 1 row affected (0.20 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Mike',29);
Query OK, 1 row affected (0.19 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Carol',24);
Query OK, 1 row affected (0.13 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('David',20);
Query OK, 1 row affected (0.23 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Maxwell',30);
Query OK, 1 row affected (0.46 sec)

3. 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from OrderByAfterLimit;

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

+----+----------+---------+
| Id | UserName | UserAge |
+----+----------+---------+
|  1 | John     |      23 |
|  2 | Larry    |      21 |
|  3 | Bob      |      26 |
|  4 | James    |      22 |
|  5 | Robert   |      28 |
|  6 | Mike     |      29 |
|  7 | Carol    |      24 |
|  8 | David    |      20 |
|  9 | Maxwell  |      30 |
+----+----------+---------+
9 rows in set (0.00 sec)

4. LIMIT 이후 다른 컬럼으로 정렬하기

이제 핵심 쿼리입니다. 내부 서브쿼리에서 UserAge를 기준으로 내림차순 정렬 후 9개 행을 제한하고, 외부 쿼리에서 UserName을 기준으로 오름차순 정렬합니다.

mysql> select *from
   -> (
   -> select *from OrderByAfterLimit order by UserAge DESC LIMIT 9) AS tbl1
   -> order by UserName;

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

+----+----------+---------+
| Id | UserName | UserAge |
+----+----------+---------+
|  3 | Bob      |      26 |
|  7 | Carol    |      24 |
|  8 | David    |      20 |
|  4 | James    |      22 |
|  1 | John     |      23 |
|  2 | Larry    |      21 |
|  9 | Maxwell  |      30 |
|  6 | Mike     |      29 |
|  5 | Robert   |      28 |
+----+----------+---------+
9 rows in set (0.00 sec)

정리

결과를 보면 나이(UserAge)로 내림차순 정렬 및 제한된 결과가 이름(UserName) 알파벳 순으로 재정렬되어 출력되는 것을 확인할 수 있습니다. 이처럼 서브쿼리에 별칭(alias)을 지정하고 외부 쿼리에서 원하는 컬럼으로 정렬하면, LIMIT이 적용된 결과 집합을 자유롭게 재정렬할 수 있습니다. 참고로 MySQL 8.0 이상에서는 CTE(공통 테이블 표현식, WITH 절)를 사용해도 동일한 결과를 얻을 수 있으며, 가독성 측면에서 더 유리할 수 있습니다.