MySQL에서 IN 절에 작성한 값의 순서 그대로 조회 결과를 정렬하고 싶다면, 단순히 IN 조건만으로는 불가능합니다. 이때 FIND_IN_SET() 함수와 ORDER BY 절을 함께 사용하면 원하는 순서대로 행을 가져올 수 있습니다.
FIND_IN_SET()을 활용한 기본 문법
기본적인 쿼리 구조는 다음과 같습니다.
SELECT yourVariableName.* FROM yourTableName yourVariableName WHERE yourVariableName.yourColumnName IN(value1,value2,...N) ORDER BY FIND_IN_SET(yourVariableName.yourColumnName,'value1,value2,...N');
FIND_IN_SET(값, 목록)은 해당 값이 문자열 목록 내에서 몇 번째 위치에 있는지를 반환합니다. 이 위치 값을 기준으로 정렬하기 때문에 IN 절에 적은 값의 순서가 곧 결과의 정렬 순서가 됩니다.
예제 테이블 생성하기
실습을 위해 간단한 테이블을 먼저 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table InDemo -> ( -> CodeId int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.95 sec)
샘플 데이터 삽입
INSERT 명령어로 몇 개의 레코드를 추가합니다.
mysql> insert into InDemo values(1,'John'); Query OK, 1 row affected (0.24 sec) mysql> insert into InDemo values(2,'Carol'); Query OK, 1 row affected (0.19 sec) mysql> insert into InDemo values(3,'Sam'); Query OK, 1 row affected (0.18 sec) mysql> insert into InDemo values(4,'Bob'); Query OK, 1 row affected (0.17 sec)
저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from InDemo;
실행 결과는 다음과 같습니다.
+--------+-------+ | CodeId | Name | +--------+-------+ | 1 | John | | 2 | Carol | | 3 | Sam | | 4 | Bob | +--------+-------+ 4 rows in set (0.00 sec)
IN 절 순서대로 행을 조회하는 실제 쿼리
이제 핵심인 쿼리입니다. (1, 3, 2, 4) 순서로 지정하여 데이터를 조회해 보겠습니다.
mysql> select tbl.* -> from InDemo tbl -> where tbl.CodeId in(1,3,2,4) -> ORDER BY FIND_IN_SET(tbl.CodeId,'1,3,2,4');
실행 결과는 다음과 같습니다.
+--------+-------+ | CodeId | Name | +--------+-------+ | 1 | John | | 3 | Sam | | 2 | Carol | | 4 | Bob | +--------+-------+ 4 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 일반적인 오름차순 정렬(1, 2, 3, 4)이 아닌, IN 절에 명시한 1 → 3 → 2 → 4 순서대로 행이 반환되었습니다.
동작 원리를 살펴보면 다음과 같습니다.
FIND_IN_SET(1, '1,3,2,4')→ 1 반환FIND_IN_SET(3, '1,3,2,4')→ 2 반환FIND_IN_SET(2, '1,3,2,4')→ 3 반환FIND_IN_SET(4, '1,3,2,4')→ 4 반환
즉, 각 행의 CodeId가 값 목록에서 차지하는 위치 번호를 계산한 뒤, 그 번호를 기준으로 오름차순 정렬하기 때문에 원하는 사용자 지정 순서대로 결과가 출력됩니다.
마무리
이처럼 FIND_IN_SET() 함수를 ORDER BY 절과 함께 활용하면 별도의 정렬 컬럼이나 CASE문 없이도 IN 절의 값 순서를 그대로 유지하며 데이터를 조회할 수 있습니다. 특정 ID 목록을 우선순위대로 노출해야 하는 상황에서 매우 유용하게 사용할 수 있습니다.