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 절)를 사용해도 동일한 결과를 얻을 수 있으며, 가독성 측면에서 더 유리할 수 있습니다.