DB/MySQL

[MySQL] ORDER BY 특정 값 우선 정렬 하기 (ORDER BY FIELD)

동호다찌 2022. 4. 1. 13:41

MySQL에서 ORDER BY 사용 시 특정한 값을 우선적으로 정렬

FIELD 함수를 이용하여 특정한 값을 우선적으로 정렬 할 수 있다.

쿼리를 통해 데이터를 가져올 때 데이터를 기반으로 조건을 걸어서 정렬하고 싶을 때가 있다.
그때 CASE나 FIELD를 사용하면 가능 조건에 따라 데이터의 정렬 우선순위를 정해줄 수 있다.

FIELD

ORDER BY FIELD (column, 1순위, 2순위, 3순위, n순위...)

어떤 특정 데이터의 값의 정렬을 우선으로 정해서 정렬하고 싶을 때 사용하면 된다.

// 기본 테이블
SELECT id, 
       title, 
       status 
  FROM movie
  ;

 

1 어벤져스 2
2 극한직업 0
3 타이타닉 1
4 스파이더맨 1
// 특정 컬럼을 order by 구에 지정하여 사용하기
SELECT id, title, status  
  FROM movie 
 ORDER BY FIELD(status, 1, 2, 0)

 

1 타이타닉 1
2 스파이더맨 1
3 어벤져스 2
4 극한직업 0
  • status의 값 별로 정렬 순위를 정해준 것이다. 값 1이 1순위고 2가 2순위, 0이 3순위인 것을 확인할 수 있다.

CASE

CASE
    WHEN <condition1> THEN <result1>
    WHEN <condition2> THEN <result2>
    WHEN <conditionN> THEN <resultN>
    ELSE <result>
END;

IF문과 비슷하게 동작하는 CASE문은 condition에 조건을 넣으면 되고 THEN 뒤에는 정렬 순위를 넣으면 된다.

// 기본 테이블
mysql > SELECT id, title, start_at, end_at 
          FROM movie

 

1 어벤져스 2021-11-01 2021-11-31
2 극한직업 2021-12-01 2021-12-31
3 타이타닉 2022-01-01 2022-01-31
4 스파이더맨 2022-02-01 2022-02-28
mysql > SELECT NOW(); // 2022-02-10

// 특정 컬럼을 조건에 맞춰 정렬하기
mysql > SELECT id, title, start_at, end_at
          CASE
               WHEN start_at <= NOW() AND NOW() < end_at THEN 1
               ELSE 2
           END movie_order
          FROM movie
         ORDER BY movie_order

 

4 스파이더맨 2022-02-01 2022-02-28
1 어벤져스 2021-11-01 2021-11-31
2 극한직업 2021-12-01 2021-12-31
3 타이타닉 2022-01-01 2022-01-31
  • 위 예제는 오늘이 영화 상영 기간에 포함되어있다면 1순위, 아니면 2순위로 정렬된다.

CASE문은 ORDER BY 구에도 사용할 수 있다. CASE문은 condition에 조건을 넣으면 되고 THEN 뒤에는 정렬 순위를 넣으면 된다.

// 기본 테이블
mysql > SELECT id, title, status 
          FROM movie

 

1 어벤져스 2
2 극한직업 0
3 타이타닉 1
4 스파이더맨 1
// case 문을 order by 구에서 사용하기
mysql > SELECT id, title, status  
          FROM movie 
         ORDER BY CASE 
                       WHEN status = 1 THEN 1
                       WHEN status = 2 THEN 2
                       ELSE 0
                   END AS 

 

1 타이타닉 1
2 스파이더맨 1
3 어벤져스 2
4 극한직업 0
  • status의 값 별로 정렬 순위를 정해준 것이다. 값 1이 1순위고 2가 2순위, 0이 3순위인 것을 확인할 수 있다.