MySQL에서 IN 절 값 순서대로 정렬하기
MySQL에서 SELECT 문의 IN 절에 지정한 값들의 순서 그대로 조회 결과를 정렬하고 싶다면, FIELD() 함수를 ORDER BY 절과 함께 사용하면 됩니다. 일반적인 ORDER BY는 오름차순이나 내림차순으로만 정렬할 수 있지만, FIELD() 함수를 활용하면 개발자가 원하는 임의의 순서로 결과를 정렬할 수 있습니다.
기본 문법
SELECT * FROM yourTableName WHERE yourColumnName IN(Value1, Value2, Value3, ......N) ORDER BY FIELD(yourColumnName, Value1, Value2, Value3, ......N);
FIELD() 함수는 첫 번째 인자로 받은 컬럼의 값이 뒤에 나열된 값들 중 몇 번째 위치에 해당하는지를 반환합니다. 이 반환값을 기준으로 정렬하기 때문에 IN 절에 나열한 값의 순서가 곧 결과의 정렬 순서가 됩니다.
예제 테이블 생성
문법을 이해하기 위해 먼저 예제 테이블을 생성해 보겠습니다.
mysql> create table SelectInDemo
-> (
-> StudentId int,
-> StudentName varchar(100),
-> StudentAge int
-> );
Query OK, 0 rows affected (1.04 sec)데이터 삽입
INSERT 명령으로 테이블에 학생 데이터를 입력합니다.
mysql> insert into SelectInDemo values(1,'Mike',23); Query OK, 1 row affected (0.21 sec) mysql> insert into SelectInDemo values(10,'Bob',21); Query OK, 1 row affected (0.16 sec) mysql> insert into SelectInDemo values(11,'Carol',30); Query OK, 1 row affected (0.25 sec) mysql> insert into SelectInDemo values(15,'Sam',24); Query OK, 1 row affected (0.15 sec) mysql> insert into SelectInDemo values(20,'John',26); Query OK, 1 row affected (0.09 sec) mysql> insert into SelectInDemo values(101,'David',27); Query OK, 1 row affected (0.25 sec) mysql> insert into SelectInDemo values(96,'Justin',23); Query OK, 1 row affected (0.27 sec)
전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from SelectInDemo;
실행 결과는 다음과 같습니다.
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 1 | Mike | 23 | | 10 | Bob | 21 | | 11 | Carol | 30 | | 15 | Sam | 24 | | 20 | John | 26 | | 101 | David | 27 | | 96 | Justin | 23 | +-----------+-------------+------------+ 7 rows in set (0.00 sec)
IN 절과 FIELD() 함수로 원하는 순서대로 정렬
이제 IN 절과 함께 FIELD() 함수를 사용하여 StudentId가 1, 96, 101, 10, 15, 11, 20 순서로 정렬되도록 조회해 보겠습니다.
mysql> select *from SelectInDemo
-> where StudentId IN(1,96,101,10,15,11,20)
-> order by field(StudentId,1,96,101,10,15,11,20);실행 결과를 보면 지정한 값의 순서 그대로 정렬된 것을 확인할 수 있습니다.
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 1 | Mike | 23 | | 96 | Justin | 23 | | 101 | David | 27 | | 10 | Bob | 21 | | 15 | Sam | 24 | | 11 | Carol | 30 | | 20 | John | 26 | +-----------+-------------+------------+ 7 rows in set (0.00 sec)
다른 순서로 정렬하기
이번에는 반대로 1, 10, 11, 15, 20, 101, 96 순서로 정렬해 보겠습니다. FIELD() 함수의 인자 순서만 바꾸면 됩니다.
mysql> select *from SelectInDemo
-> where StudentId IN(1,10,11,15,20,101,96)
-> order by field(StudentId,1,10,11,15,20,101,96);실행 결과는 다음과 같습니다.
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 1 | Mike | 23 | | 10 | Bob | 21 | | 11 | Carol | 30 | | 15 | Sam | 24 | | 20 | John | 26 | | 101 | David | 27 | | 96 | Justin | 23 | +-----------+-------------+------------+ 7 rows in set (0.00 sec)
정리
MySQL에서 IN 절에 지정한 값의 순서대로 결과를 정렬하려면 ORDER BY 절에 FIELD() 함수를 사용하면 됩니다. FIELD() 함수는 컬럼 값이 인자 목록에서 몇 번째 위치에 있는지를 반환하며, 이 값을 기준으로 정렬되기 때문에 원하는 임의의 순서로 손쉽게 정렬할 수 있습니다. 특정 ID 목록을 우선순위대로 표시해야 하는 경우 등 실무에서 매우 유용하게 활용됩니다.