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

MySQL IN 쿼리에서 결과 순서 유지하는 방법 – FIELD() 함수 활용

MySQL에서 IN 절을 사용하면 기본적으로 지정한 값의 순서와 상관없이 결과가 반환됩니다. 하지만 FIELD() 함수를 함께 사용하면 IN 조건에 나열한 값의 순서 그대로 결과를 정렬할 수 있습니다.

기본 문법

select *from yourTableName anyVariableName where anyVariableName.yourColumnName in(value1,value2,......N)
order by field(anyVariableName.yourColumnName,value1,value2,......N);

FIELD() 함수는 첫 번째 인자로 전달된 값이 뒤따르는 값 목록 중 몇 번째 위치에 있는지를 반환합니다. 이를 ORDER BY 절과 결합하면 목록에 명시한 순서대로 행이 정렬됩니다.

예제 테이블 생성

문법을 실제로 확인하기 위해 먼저 테이블을 생성하겠습니다.

mysql> create table OrderInDemo
    -> (
       -> Id int,
       -> Name varchar(100),
       -> Age int
    -> );
Query OK, 0 rows affected (1.24 sec)

샘플 데이터 삽입

이제 테이블에 여러 개의 레코드를 삽입합니다.

mysql> insert into OrderInDemo values(90,'David',23);
Query OK, 1 row affected (0.10 sec)

mysql> insert into OrderInDemo values(9,'Sam',24);
Query OK, 1 row affected (0.59 sec)

mysql> insert into OrderInDemo values(10,'Carol',19);
Query OK, 1 row affected (0.25 sec)

mysql> insert into OrderInDemo values(1,'John',26);
Query OK, 1 row affected (0.42 sec)

mysql> insert into OrderInDemo values(3,'Johnson',25);
Query OK, 1 row affected (0.18 sec)

mysql> insert into OrderInDemo values(2,'Ramit',20);
Query OK, 1 row affected (0.18 sec)

전체 데이터 조회

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from OrderInDemo;

실행 결과는 다음과 같습니다.

+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
|   90 | David   |   23 |
|    9 | Sam     |   24 |
|   10 | Carol   |   19 |
|    1 | John    |   26 |
|    3 | Johnson |   25 |
|    2 | Ramit   |   20 |
+------+---------+------+
6 rows in set (0.00 sec)

IN 쿼리에서 순서 유지하기

앞서 소개한 문법을 적용하여 IN 쿼리의 결과 순서를 유지해 보겠습니다. 아래 예제에서는 Id가 10, 1, 3인 행을 해당 순서 그대로 조회합니다.

mysql> select *from OrderInDemo OD where OD.Id in(10,1,3)
    -> order by field(OD.Id,10,1,3);

결과를 보면 쿼리에 지정한 순서(10, 1, 3)대로 행이 정렬되어 출력되는 것을 확인할 수 있습니다.

+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
|   10 | Carol   |   19 |
|    1 | John    |   26 |
|    3 | Johnson |   25 |
+------+---------+------+
3 rows in set (0.00 sec)

이처럼 ORDER BY FIELD()를 활용하면 별도의 정렬 컬럼 없이도 IN 조건에 나열한 값의 순서를 그대로 유지한 결과를 손쉽게 얻을 수 있습니다.