MySQL에서 IN 절을 사용하면 조건에 맞는 레코드만 필터링할 수 있지만, 기본적으로 결과는 지정한 값의 순서와 무관하게 반환됩니다. 만약 IN 절에 나열한 순서 그대로 결과 집합을 정렬하고 싶다면 FIND_IN_SET() 함수를 활용해야 합니다.
예제 테이블 생성하기
먼저 실습용 테이블을 만들어 보겠습니다.
mysql> create table returnRecordSetOrderDemo
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (1.01 sec)테스트 데이터 삽입하기
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into returnRecordSetOrderDemo values(100,'John'); Query OK, 1 row affected (0.13 sec) mysql> insert into returnRecordSetOrderDemo values(130,'Carol'); Query OK, 1 row affected (0.13 sec) mysql> insert into returnRecordSetOrderDemo values(103,'Bob'); Query OK, 1 row affected (0.17 sec) mysql> insert into returnRecordSetOrderDemo values(134,'Sam'); Query OK, 1 row affected (0.27 sec) mysql> insert into returnRecordSetOrderDemo values(102,'Larry'); Query OK, 1 row affected (0.15 sec) mysql> insert into returnRecordSetOrderDemo values(145,'David'); Query OK, 1 row affected (0.18 sec)
전체 레코드 확인하기
SELECT 문으로 테이블에 저장된 모든 데이터를 조회해 보겠습니다.
mysql> select * from returnRecordSetOrderDemo;
실행 결과는 다음과 같습니다.
+------+-------+ | Id | Name | +------+-------+ | 100 | John | | 130 | Carol | | 103 | Bob | | 134 | Sam | | 102 | Larry | | 145 | David | +------+-------+ 6 rows in set (0.00 sec)
IN 절 + FIND_IN_SET()로 원하는 순서 정렬하기
이제 핵심 쿼리입니다. IN 절로 특정 Id만 조회하면서, FIND_IN_SET()을 ORDER BY 절에 함께 사용하면 IN 목록에 적어준 순서대로 결과가 반환됩니다.
mysql> select * from returnRecordSetOrderDemo
-> where Id in(100,145,103,130)
-> order by FIND_IN_SET(Id,'100,145,103,130');실행 결과는 다음과 같습니다.
+------+-------+ | Id | Name | +------+-------+ | 100 | John | | 145 | David | | 103 | Bob | | 130 | Carol | +------+-------+ 4 rows in set (0.00 sec)
FIND_IN_SET() 동작 원리
FIND_IN_SET(값, '문자열 목록')은 두 번째 인자로 전달된 쉼표 구분 목록에서 해당 값이 몇 번째 위치에 있는지를 반환합니다. 예를 들어 FIND_IN_SET(145, '100,145,103,130')은 2를 반환하므로, 이 값을 기준으로 ORDER BY 하면 IN 절에 작성한 순서(100 → 145 → 103 → 130) 그대로 결과가 정렬됩니다.
이 방식은 ID 목록을 애플리케이션 로직에서 이미 정렬해 둔 상태로 DB에 전달할 때 특히 유용합니다. 다만 목록이 매우 길어지면 성능에 영향을 줄 수 있으므로, 대량의 데이터에는 CASE 문이나 별도의 정렬용 컬럼/조인 테이블을 고려하는 것이 좋습니다.