MySQL IN 절과 ORDER BY FIELD()를 활용한 순서 지정 조회
IN 절에 지정한 값들만 조회하고, 그 값을 원하는 순서대로 정렬하고 싶다면 IN() 조건과 ORDER BY 절의 FIELD() 함수를 함께 사용하면 됩니다. 먼저 예제 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1986
(
Number int
);
Query OK, 0 rows affected (0.00 sec)insert 명령을 사용하여 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable1986 values(50); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1986 values(60); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1986 values(100); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1986 values(200); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1986 values(350); Query OK, 1 row affected (0.00 sec)
select 문으로 테이블의 전체 레코드를 확인합니다.
mysql> select * from DemoTable1986;
실행 결과는 다음과 같습니다.
+--------+ | Number | +--------+ | 50 | | 60 | | 100 | | 200 | | 350 | +--------+ 5 rows in set (0.00 sec)
FIELD() 함수로 정렬 순서 지정하기
다음은 IN 절에 지정된 값(50, 100, 350)만 조회하면서, FIELD() 함수를 사용해 350 → 100 → 50 순서로 정렬하는 쿼리입니다.
mysql> select * from DemoTable1986 where Number IN(50,100,350) order by field(Number,350,100,50);
실행 결과는 다음과 같습니다.
+--------+ | Number | +--------+ | 350 | | 100 | | 50 | +--------+ 3 rows in set (0.00 sec)
동작 원리: FIELD() 함수는 첫 번째 인자로 받은 값이 이후 나열된 값들 중 몇 번째 위치에 해당하는지를 반환합니다. 즉, Number가 350이면 1, 100이면 2, 50이면 3을 반환하므로, ORDER BY 절에서 이 결과값을 기준으로 정렬하면 IN 절에 나열한 순서 그대로 데이터가 출력됩니다. 일반적인 ASC/DESC 정렬과 달리 개발자가 직접 지정한 임의의 순서로 결과를 제어할 수 있다는 점이 큰 장점입니다.