ORDER BY FIELD와 ID 정렬을 함께 사용하기
MySQL에서 특정 값을 가장 앞에 배치하고, 나머지 행은 ID를 기준으로 내림차순 정렬하고 싶다면 ORDER BY FIELD() 함수를 활용하면 됩니다. FIELD() 함수는 지정한 값이 목록에서 몇 번째 위치에 있는지를 반환하므로, 이를 정렬 조건으로 사용하면 원하는 순서대로 결과를 얻을 수 있습니다.
먼저 예제 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (1.78 sec)
샘플 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values(101,'Chris');
Query OK, 1 row affected (0.38 sec)
mysql> insert into DemoTable values(201,'Mike');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(110,'Adam');
Query OK, 1 row affected (0.52 sec)
mysql> insert into DemoTable values(250,'John');
Query OK, 1 row affected (0.33 sec)
현재 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 101 | Chris |
| 201 | Mike |
| 110 | Adam |
| 250 | John |
+------+-------+
4 rows in set (0.00 sec)
ORDER BY FIELD를 적용한 정렬 쿼리
이제 'Mike'라는 이름을 가진 행을 최상단에 배치하고, 나머지 행은 ID 내림차순으로 정렬하는 쿼리를 작성해 보겠습니다.
mysql> select *from DemoTable
-> order by field(Name,'Mike') desc,Id desc;
정렬 결과
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+------+-------+
| Id | Name |
+------+-------+
| 201 | Mike |
| 250 | John |
| 110 | Adam |
| 101 | Chris |
+------+-------+
4 rows in set (0.01 sec)
결과 분석
출력 결과를 살펴보면 다음과 같은 정렬 규칙이 적용된 것을 확인할 수 있습니다.
1. FIELD(Name, 'Mike') DESC: FIELD() 함수는 Name 컬럼의 값이 'Mike'와 일치하면 1을, 일치하지 않으면 0을 반환합니다. 이를 내림차순(DESC)으로 정렬하면 'Mike'인 행이 항상 맨 앞에 오게 됩니다.
2. Id DESC: 첫 번째 조건에서 동일한 순위를 가진 행들(즉, 'Mike'가 아닌 행들)은 ID를 기준으로 내림차순 정렬됩니다. 따라서 250(John) → 110(Adam) → 101(Chris) 순서로 배치됩니다.
이처럼 ORDER BY FIELD()는 여러 개의 값을 우선순위 순서로 지정할 수도 있습니다. 예를 들어 field(Name,'Mike','John')처럼 작성하면 Mike가 첫 번째, John이 두 번째 우선순위로 정렬되며, 그 외의 값들은 모두 동일한 순위로 처리되어 두 번째 정렬 조건(ID)에 따라 배열됩니다.