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

MySQL에서 ORDER BY FIELD() 함수로 원하는 단어 순서대로 정렬하는 방법

MySQL에서 알파벳순이나 오름차순·내림차순 같은 기본 정렬이 아닌, 사용자가 지정한 특정 단어(값)의 순서대로 데이터를 정렬하고 싶다면 ORDER BY 절과 함께 FIELD() 함수를 사용해야 합니다.

FIELD() 함수는 두 번째 인수부터 나열된 값들 중에서 첫 번째 인수와 일치하는 값의 위치 인덱스를 반환합니다. 이 특성을 활용하면 원하는 순서를 직접 정의하여 정렬할 수 있습니다.

예제를 통해 살펴보겠습니다. 먼저 테이블을 생성합니다.

mysql> create table DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName varchar(20),
    StudentFavouriteSubject varchar(100)
);
Query OK, 0 rows affected (0.52 sec)

테이블에 샘플 데이터 삽입하기

INSERT 명령을 사용해 테이블에 레코드를 추가합니다.

mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('Larry','Java');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('Sam','C');
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('Bob','MongoDB');
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('David','MySQL');
Query OK, 1 row affected (0.17 sec)

저장된 전체 레코드 조회하기

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

mysql> select *from DemoTable;

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

+-----------+------------------+-------------------------+
| StudentId | StudentFirstName | StudentFavouriteSubject |
+-----------+------------------+-------------------------+
|         1 | Larry            | Java                    |
|         2 | Sam              | C                       |
|         3 | Bob              | MongoDB                 |
|         4 | David            | MySQL                   |
+-----------+------------------+-------------------------+
4 rows in set (0.00 sec)

ORDER BY FIELD()로 사용자 정의 순서 정렬하기

이제 FIELD() 함수를 사용해 'MongoDB', 'MySQL', 'Java', 'C' 순서대로 과목을 정렬하는 쿼리를 실행해 보겠습니다.

mysql> select *from DemoTable
ORDER BY FIELD(`StudentFavouriteSubject`, 'MongoDB','MySQL','Java','C');

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

+-----------+------------------+-------------------------+
| StudentId | StudentFirstName | StudentFavouriteSubject |
+-----------+------------------+-------------------------+
|         3 | Bob              | MongoDB                 |
|         4 | David            | MySQL                   |
|         1 | Larry            | Java                    |
|         2 | Sam              | C                       |
+-----------+------------------+-------------------------+
4 rows in set (0.03 sec)

FIELD() 함수 동작 원리

출력 결과를 보면 컬럼 값이 FIELD() 함수에 나열한 순서('MongoDB' → 'MySQL' → 'Java' → 'C') 그대로 정렬된 것을 확인할 수 있습니다.

참고로, 목록에 없는 값은 인덱스 0을 반환하므로 해당 행들은 가장 앞쪽에 배치됩니다. 내림차순(DESC)으로 정렬하면 목록에 없는 값들이 뒤쪽으로 밀려나게 되니, 상황에 맞게 활용하시기 바랍니다.