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

MySQL에서 지정한 순서대로 조회 결과 정렬하기 – IN()과 FIELD() 함수 활용

MySQL에서 원하는 순서대로 데이터 정렬하기

일반적으로 MySQL에서 ORDER BY 절은 오름차순(ASC) 또는 내림차순(DESC)으로만 정렬할 수 있습니다. 하지만 때로는 개발자가 미리 정해 놓은 특정 순서대로 결과를 가져와야 할 때가 있습니다. 이럴 때 WHERE 절의 IN() 연산자와 FIELD() 함수를 함께 사용하면 원하는 순서 그대로 데이터를 조회할 수 있습니다.

먼저 예제에 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable(   StudentId varchar(10),   StudentName varchar(20));Query OK, 0 rows affected (4.11 sec)

INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다.

mysql> insert into DemoTable values('10001','Adam');Query OK, 1 row affected (0.52 sec)mysql> insert into DemoTable values('1010','Chris');Query OK, 1 row affected (0.72 sec)mysql> insert into DemoTable values('1020','Bob');Query OK, 1 row affected (0.34 sec)mysql> insert into DemoTable values('1030','Carol');Query OK, 1 row affected (0.47 sec)mysql> insert into DemoTable values('1040','Sam');Query OK, 1 row affected (0.29 sec)

SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.

mysql> select *from DemoTable;

위 쿼리는 다음과 같은 결과를 출력합니다.

+-----------+-------------+| StudentId | StudentName |+-----------+-------------+| 10001     | Adam        || 1010      | Chris       || 1020      | Bob         || 1030      | Carol       || 1040      | Sam         |+-----------+-------------+5 rows in set (0.00 sec)

지정한 순서대로 정렬하는 쿼리 작성 방법

이제 핵심 부분입니다. 아래 쿼리처럼 WHERE 절에서 IN()으로 조회할 값을 나열하고, ORDER BY 절에서 FIELD() 함수에 같은 순서로 값을 전달하면 됩니다.

mysql> select *from DemoTablewhere StudentId IN('1040','1010','1020','1030','10001')order by FIELD(StudentId,'1040','1010','1020','1030','10001');

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

+-----------+-------------+| StudentId | StudentName |+-----------+-------------+| 1040      | Sam         || 1010      | Chris       || 1020      | Bob         || 1030      | Carol       || 10001     | Adam        |+-----------+-------------+5 rows in set (0.02 sec)

동작 원리 살펴보기

FIELD() 함수는 첫 번째 인수로 전달된 값이 뒤따르는 인수 목록 중 몇 번째 위치에 있는지를 반환합니다. 예를 들어 FIELD(StudentId, '1040', '1010', ...)는 StudentId가 '1040'이면 1을, '1010'이면 2를 반환하는 식입니다. 따라서 ORDER BY 절에서 이 함수를 사용하면 IN() 목록에 나열된 순서, 즉 개발자가 지정한 순서 그대로 결과가 정렬됩니다.

참고로 IN() 조건 없이 FIELD()만 사용해도 동일하게 정렬할 수 있지만, IN()을 함께 사용하면 목록에 포함된 행만 필터링되므로 의도한 결과 집합을 더 명확하게 얻을 수 있습니다. 우선순위 큐, 카테고리 고정 노출, 특정 ID 우선 처리 등 실무에서 다양하게 활용할 수 있는 유용한 기법입니다.