MySQL에서 ORDER BY 사용 시 특정한 값을 우선적으로 정렬
FIELD
함수를 이용하여 특정한 값을 우선적으로 정렬 할 수 있다.
쿼리를 통해 데이터를 가져올 때 데이터를 기반으로 조건을 걸어서 정렬하고 싶을 때가 있다.
그때 CASE
나 FIELD
를 사용하면 가능 조건에 따라 데이터의 정렬 우선순위를 정해줄 수 있다.
FIELD
ORDER BY FIELD (column, 1순위, 2순위, 3순위, n순위...)
어떤 특정 데이터의 값의 정렬을 우선으로 정해서 정렬하고 싶을 때 사용하면 된다.
mysql > SELECT id, title, status
FROM movie
id | title | status |
---|
1 | 어벤져스 | 2 |
2 | 극한직업 | 0 |
3 | 타이타닉 | 1 |
4 | 스파이더맨 | 1 |
mysql > SELECT id, title, status
FROM movie
ORDER BY FIELD(status, 1, 2, 0)
id | title | status |
---|
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
id | title | start_at | end_at |
---|
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();
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
id | title | start_at | end_at |
---|
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
id | title | status |
---|
1 | 어벤져스 | 2 |
2 | 극한직업 | 0 |
3 | 타이타닉 | 1 |
4 | 스파이더맨 | 1 |
mysql > SELECT id, title, status
FROM movie
ORDER BY CASE
WHEN status = 1 THEN 1
WHEN status = 2 THEN 2
ELSE 0
END AS
id | title | status |
---|
1 | 타이타닉 | 1 |
2 | 스파이더맨 | 1 |
3 | 어벤져스 | 2 |
4 | 극한직업 | 0 |
- status의 값 별로 정렬 순위를 정해준 것이다. 값 1이 1순위고 2가 2순위, 0이 3순위인 것을 확인할 수 있다.