Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 IN 절에 지정한 순서대로 행을 조회하는 방법 – FIND_IN_SET() 완벽 가이드

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 목록을 우선순위대로 노출해야 하는 상황에서 매우 유용하게 사용할 수 있습니다.