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

MySQL ORDER BY로 특정 값만 내림차순, 나머지는 오름차순 정렬하기

MySQL에서 특정 값 몇 개만 내림차순으로 정렬하고 나머지 값들은 오름차순으로 정렬하고 싶다면 FIELD() 함수를 활용하면 됩니다. FIELD() 함수는 첫 번째 인자로 전달된 값이 이후 나열된 값 목록 중 몇 번째 위치에 해당하는지를 반환하며, 이 반환값을 기준으로 정렬하면 원하는 커스텀 정렬 순서를 손쉽게 구현할 수 있습니다.

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

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

이제 insert 명령을 사용하여 테이블에 샘플 데이터를 삽입합니다.

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(70);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(60);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(56);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(81);
Query OK, 1 row affected (0.44 sec)
mysql> insert into DemoTable values(85);
Query OK, 1 row affected (0.15 sec)

select 문을 실행하여 테이블에 저장된 모든 레코드를 확인해 보겠습니다.

mysql> select *from DemoTable;

출력 결과

+-------+
| Value |
+-------+
| 10    |
| 70    |
| 60    |
| 56    |
| 81    |
| 85    |
+-------+
6 rows in set (0.00 sec)

다음은 특정 3개 값(60, 70, 81)은 내림차순으로 정렬하고 나머지 값들은 오름차순으로 정렬하는 쿼리입니다.

mysql> select *from DemoTable order by field(Value,60,70,81) desc;

출력 결과

+-------+
| Value |
+-------+
| 81    |
| 70    |
| 60    |
| 10    |
| 56    |
| 85    |
+-------+
6 rows in set (0.00 sec)

동작 원리 살펴보기

위 쿼리가 어떻게 작동하는지 각 값의 FIELD() 함수 반환값을 살펴보면 이해하기 쉽습니다.

  • 60, 70, 81은 각각 위치 1, 2, 3을 반환합니다.
  • 목록에 없는 10, 56, 85는 모두 0을 반환합니다.

ORDER BY가 내림차순(desc)으로 적용되므로 위치 값이 큰 81, 70, 60이 먼저 출력되고, 그다음에 0을 반환한 나머지 값들이 테이블에 저장된 원래 순서대로 출력됩니다. 만약 나머지 값들을 오름차순으로 정렬하고 싶다면 아래와 같이 두 단계로 정렬 조건을 지정할 수도 있습니다.

mysql> select *from DemoTable 
order by field(Value,60,70,81) desc, Value asc;

이처럼 FIELD() 함수를 응용하면 복잡한 CASE 문 없이도 간결하게 우선순위 기반 정렬을 구현할 수 있어 실무에서 유용하게 활용됩니다.