MySQL에서 IN() 절에 지정한 인수 순서를 기준으로 결과를 내림차순(DESC) 정렬하려면 FIELD() 함수와 DESC 키워드를 함께 사용하면 됩니다. 일반적인 ORDER BY는 값의 크기순으로 정렬하지만, FIELD() 함수를 활용하면 IN() 목록에 나열된 순서 그대로 정렬 순서를 제어할 수 있습니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
-> (
-> Number int
-> );
Query OK, 0 rows affected (0.57 sec)
1. 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 몇 개 추가합니다.
mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(50);
Query OK, 1 row affected (0.15 sec)
2. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
출력 결과
위 쿼리는 다음과 같은 결과를 생성합니다.
+--------+
| Number |
+--------+
| 10 |
| 20 |
| 30 |
| 40 |
| 50 |
+--------+
5 rows in set (0.00 sec)
3. FIELD() 함수로 내림차순 정렬하기
다음은 MySQL의 IN()에 인수를 배치한 후 FIELD() 함수를 사용해 해당 인수 순서대로 열을 내림차순 정렬하는 쿼리입니다.
mysql> select *from DemoTable where Number IN (40,50,20,30,10) ORDER BY FIELD(Number, 40,50,20,30,10) DESC;
여기서 FIELD(Number, 40,50,20,30,10)는 각 행의 Number 값이 인수 목록에서 몇 번째 위치에 있는지를 반환합니다. 이 값에 DESC를 적용하면 목록의 마지막에 지정된 값부터 역순으로 출력됩니다.
출력 결과
위 쿼리는 다음과 같은 결과를 생성합니다.
+--------+
| Number |
+--------+
| 10 |
| 30 |
| 20 |
| 50 |
| 40 |
+--------+
5 rows in set (0.03 sec)
결과를 보면 IN() 목록인 (40, 50, 20, 30, 10)의 역순인 10, 30, 20, 50, 40 순서로 정렬되어 출력된 것을 확인할 수 있습니다. 이처럼 FIELD() 함수를 ORDER BY 절과 함께 사용하면 원하는 임의의 순서나 그 역순으로 자유롭게 정렬할 수 있습니다.