MySQL에서 IN 절을 사용하면 여러 조건값에 해당하는 레코드를 한 번에 조회할 수 있습니다. 하지만 기본적으로 조회 결과는 IN 절에 나열한 값의 순서를 따르지 않습니다. 만약 IN 절에 지정한 값의 위치 순서 그대로 결과를 가져오고 싶다면 FIND_IN_SET() 함수를 ORDER BY 절과 함께 사용해야 합니다.
이 글에서는 실제 예제 테이블을 만들고, IN 절 순서대로 레코드를 정렬하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 직원 정보를 저장할 테이블을 생성합니다.
mysql> create table recordSetOrderDemo
-> (
-> EmployeeId int,
-> EmployeeName varchar(30)
-> );
Query OK, 0 rows affected (0.63 sec)
2. 테스트 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into recordSetOrderDemo values(20,"John");
Query OK, 1 row affected (0.20 sec)
mysql> insert into recordSetOrderDemo values(10,"Larry");
Query OK, 1 row affected (0.14 sec)
mysql> insert into recordSetOrderDemo values(100,"Mike");
Query OK, 1 row affected (0.14 sec)
mysql> insert into recordSetOrderDemo values(50,"Sam");
Query OK, 1 row affected (0.11 sec)
mysql> insert into recordSetOrderDemo values(10,"David");
Query OK, 1 row affected (0.18 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from recordSetOrderDemo;
실행 결과는 다음과 같습니다.
+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
| 20 | John |
| 10 | Larry |
| 100 | Mike |
| 50 | Sam |
| 10 | David |
+------------+--------------+
5 rows in set (0.00 sec)
4. IN 절 순서대로 결과 정렬하기
이제 핵심 부분입니다. 아래 쿼리처럼 FIND_IN_SET() 함수를 ORDER BY 절에 사용하면, IN 절에 나열한 값의 위치 순서대로 레코드가 반환됩니다.
mysql> select *from recordSetOrderDemo where EmployeeId IN(100,10,20,50)
-> ORDER BY FIND_IN_SET(EmployeeId,'100,10,20,50');
실행 결과를 보면 EmployeeId가 IN 절에 지정한 순서인 100 → 10 → 20 → 50 순으로 정렬되어 출력됩니다.
+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
| 100 | Mike |
| 10 | Larry |
| 10 | David |
| 20 | John |
| 50 | Sam |
+------------+--------------+
5 rows in set (0.03 sec)
FIND_IN_SET() 동작 원리
FIND_IN_SET(찾을값, '값목록')은 두 번째 인자로 전달된 쉼표 구분 목록에서 첫 번째 인자 값이 몇 번째 위치에 있는지를 반환합니다. 예를 들어 FIND_IN_SET(100, '100,10,20,50')은 1을, FIND_IN_SET(50, '100,10,20,50')은 4를 반환합니다. 이 위치 값을 기준으로 ORDER BY 정렬을 수행하기 때문에 IN 절에 적어 준 순서 그대로 결과가 출력되는 것입니다.
참고로 같은 EmployeeId(예: 10)를 가진 Larry와 David처럼 중복된 값이 있으면, 정렬 우선순위가 같으므로 두 레코드는 연달아 출력됩니다.