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

ASC나 DESC 없이 MySQL ORDER BY로 원하는 순서대로 정렬하는 방법

FIND_IN_SET() 함수로 사용자 지정 정렬 구현하기

MySQL에서 ASC(오름차순)나 DESC(내림차순) 키워드를 사용하지 않고도 원하는 순서대로 결과를 정렬할 수 있습니다. 이때 유용하게 활용되는 것이 바로 FIND_IN_SET() 함수입니다. 이 함수는 쉼표로 구분된 문자열 목록에서 특정 값의 위치를 반환하기 때문에, ORDER BY 절과 함께 사용하면 개발자가 직접 지정한 임의의 순서대로 데이터를 정렬할 수 있습니다.

1단계: 테이블 생성

먼저 데모용 테이블을 생성합니다.

mysql> create table DemoTable
-> (
-> Number int
-> );
Query OK, 0 rows affected (2.25 sec)

2단계: 데이터 삽입

insert 명령어를 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.91 sec)

mysql> insert into DemoTable values(60);
Query OK, 1 row affected (0.69 sec)

mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.72 sec)

mysql> insert into DemoTable values(800);
Query OK, 1 row affected (0.75 sec)

3단계: 전체 레코드 조회

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

mysql> select *from DemoTable;

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

+--------+
| Number |
+--------+
| 20 |
| 60 |
| 40 |
| 800 |
+--------+
4 rows in set (0.00 sec)

4단계: FIND_IN_SET()으로 원하는 순서대로 정렬

이제 ASC나 DESC 없이 FIND_IN_SET()을 활용해 원하는 순서(40 → 20 → 800 → 60)대로 정렬하는 쿼리를 실행합니다.

mysql> select *from DemoTable
-> order by FIND_IN_SET(Number,'40,20,800,60');

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

+--------+
| Number |
+--------+
| 40 |
| 20 |
| 800 |
| 60 |
+--------+
4 rows in set (0.14 sec)

동작 원리

FIND_IN_SET(Number, '40,20,800,60')은 Number 컬럼의 값이 문자열 목록에서 몇 번째 위치에 있는지를 반환합니다. 예를 들어 40은 목록의 첫 번째이므로 1을, 20은 두 번째이므로 2를 반환합니다. ORDER BY는 이 위치 값을 기준으로 정렬하기 때문에, 결과적으로 목록에 나열한 순서 그대로 데이터가 출력됩니다.

참고로 목록에 포함되지 않은 값이 있다면 FIND_IN_SET()은 0을 반환하며, 해당 값들은 정렬 시 가장 앞쪽에 배치됩니다. 이러한 특성을 활용하면 우선순위 기반 정렬이나 카테고리 순서 지정 등 다양한 상황에서 유연하게 응용할 수 있습니다.