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

MySQL IN()과 FIELD() 함수로 원하는 순서대로 ID 정렬하는 방법

MySQL에서 IN() 조건으로 조회한 결과를 임의로 지정한 순서, 즉 사용자가 원하는 순서 그대로 표시하려면 FIELD() 함수를 함께 사용해야 합니다. IN()만 단독으로 사용하면 지정한 순서가 아닌 테이블 저장 순서나 기본 정렬 순서로 결과가 반환되기 때문입니다.

1. 예제 테이블 생성

먼저 실습에 사용할 테이블을 생성합니다.

mysql> create table DemoTable
    (
    UserId int
    );
Query OK, 0 rows affected (0.64 sec)

2. 데이터 삽입

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

mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(80);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(70);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(60);
Query OK, 1 row affected (0.13 sec)

3. 현재 저장된 데이터 확인

SELECT 명령으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

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

+--------+
| UserId |
+--------+
| 100    |
| 10     |
| 40     |
| 80     |
| 70     |
| 60     |
+--------+
6 rows in set (0.00 sec)

현재는 데이터가 입력된 순서 그대로 반환되고 있습니다.

4. IN()과 FIELD()를 조합해 원하는 순서로 정렬

이제 IN()으로 특정 ID들을 조회하고, ORDER BY FIELD()를 사용해 지정한 순서(60 → 100 → 10 → 80 → 40 → 70)대로 결과를 표시해 보겠습니다.

mysql> select UserId from DemoTable where UserId IN(60,100,10,80,40,70)
order by field(UserId,60,100,10,80,40,70);

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

+--------+
| UserId |
+--------+
| 60     |
| 100    |
| 10     |
| 80     |
| 40     |
| 70     |
+--------+
6 rows in set (0.03 sec)

동작 원리

FIELD(UserId, 60, 100, 10, 80, 40, 70)은 첫 번째 인수인 UserId 값이 이후 나열된 값들 중 몇 번째 위치와 일치하는지를 숫자로 반환합니다. 예를 들어 UserId가 100이면 두 번째 값과 일치하므로 2를 반환합니다. 이 반환값을 기준으로 ORDER BY가 정렬을 수행하기 때문에, FIELD() 함수 안에 나열한 값의 순서가 곧 최종 출력 순서가 됩니다.

이 방식은 게시물 고정 순서, 카테고리 우선순위 표시처럼 오름차순·내림차순 정렬로는 구현할 수 없는 사용자 지정(custom) 정렬이 필요할 때 매우 유용하게 활용됩니다.