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

MySQL IN 절 조회 결과를 원하는 순서대로 정렬하는 방법 – FIND_IN_SET() 활용하기

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 문이나 별도의 정렬용 컬럼/조인 테이블을 고려하는 것이 좋습니다.