MySQL에서 원하는 순서대로 데이터를 정렬하려면 ORDER BY FIELD() 함수를 활용하면 됩니다. 일반적인 오름차순(ASC)이나 내림차순(DESC) 정렬과 달리, FIELD() 함수를 사용하면 개발자가 직접 지정한 임의의 순서대로 결과를 정렬할 수 있습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
-> (
-> Id int
-> );
Query OK, 0 rows affected (0.82 sec)
2. 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 입력합니다.
mysql> insert into DemoTable values(101);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(103);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(102);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values(105);
Query OK, 1 row affected (0.14 sec)
3. 전체 레코드 조회
SELECT 문으로 테이블에 저장된 모든 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------+
| Id |
+------+
| 101 |
| 103 |
| 102 |
| 105 |
+------+
4 rows in set (0.00 sec)
4. FIELD() 함수로 사용자 정의 정렬 수행
이제 FIELD() 함수를 사용해 원하는 순서(102 → 105 → 101 → 103)대로 정렬하는 쿼리를 실행해 보겠습니다.
mysql> select *from DemoTable order by field(Id,102,105,101,103);
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 102 |
| 105 |
| 101 |
| 103 |
+------+
4 rows in set (0.00 sec)
FIELD() 함수 동작 원리
FIELD(Id, 102, 105, 101, 103)는 각 행의 Id 값이 두 번째 인수 목록 중 어느 위치에 해당하는지를 숫자로 반환합니다. 예를 들어 Id가 102면 1, 105면 2, 101이면 3, 103이면 4를 반환하며, ORDER BY는 이 반환값을 기준으로 오름차순 정렬을 수행합니다.
참고 사항
FIELD() 함수의 값 목록에 포함되지 않은 값은 0을 반환하므로, 목록에 없는 레코드들은 가장 앞쪽에 정렬됩니다. 만약 이러한 레코드를 맨 뒤로 보내고 싶다면 ORDER BY FIELD(Id, 102, 105, 101, 103) DESC처럼 DESC를 붙이거나, CASE 문을 조합하는 방법도 고려할 수 있습니다.