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

MySQL에서 최근 3개월 데이터를 우선 정렬한 뒤 알파벳 순으로 정렬하는 방법

MySQL에서 최근 3개월 이내의 데이터를 먼저 출력하고, 그 다음 고객 이름을 알파벳 순으로 정렬해야 하는 경우가 종종 있습니다. 예를 들어 최근에 구매한 고객을 상단에 노출하고, 오래된 기록은 이름순으로 깔끔하게 보여주고 싶을 때 유용합니다. 이 글에서는 ORDER BY 절과 CURDATE(), INTERVAL 함수를 활용해 이를 구현하는 방법을 단계별로 살펴보겠습니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable1526
    -> (
    -> CustomerName varchar(20),
    -> PurchaseDate date
    -> );
Query OK, 0 rows affected (0.67 sec)

2. 샘플 데이터 삽입하기

INSERT 명령을 사용해 몇 개의 레코드를 추가합니다. 여기서는 2019년 날짜들을 입력했습니다.

mysql> insert into DemoTable1526 values('Adam','2019-06-01');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1526 values('Sam','2019-04-26');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1526 values('Chris','2019-05-24');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1526 values('David','2019-10-10');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1526 values('Bob','2019-12-31');
Query OK, 1 row affected (0.23 sec)

3. 저장된 데이터 확인하기

SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select * from DemoTable1526;

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

+--------------+--------------+
| CustomerName | PurchaseDate |
+--------------+--------------+
| Adam        |  2019-06-01 |
| Sam         |  2019-04-26 |
| Chris       |  2019-05-24 |
| David       |  2019-10-10 |
| Bob         |  2019-12-31 |
+--------------+--------------+
5 rows in set (0.00 sec)

4. 현재 날짜 확인하기

정렬 기준이 되는 현재 날짜를 먼저 확인합니다.

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2019-10-08 |
+------------+
1 row in set (0.00 sec)

5. 최근 3개월 우선 정렬 후 알파벳순 정렬 쿼리

핵심은 ORDER BY 절에서 불리언(Boolean) 조건식을 활용하는 것입니다. PurchaseDate > CURDATE() - INTERVAL 3 MONTH 조건이 참(1)인 행, 즉 최근 3개월 이내의 레코드가 먼저 출력되고, 각 그룹 내에서는 CustomerName을 기준으로 알파벳 순서대로 정렬됩니다.

mysql> select * from DemoTable1526
    -> order by PurchaseDate > curdate() - interval 3 month desc,CustomerName;

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

+--------------+--------------+
| CustomerName | PurchaseDate |
+--------------+--------------+
| Bob         |  2019-12-31 |
| David       |  2019-10-10 |
| Adam        |  2019-06-01 |
| Chris       |  2019-05-24 |
| Sam         |  2019-04-26 |
+--------------+--------------+
5 rows in set (0.00 sec)

결과 분석

현재 날짜가 2019-10-08이므로, 최근 3개월(2019-07-08 이후)에 해당하는 Bob(2019-12-31)David(2019-10-10)이 먼저 출력되었습니다. 나머지 레코드인 Adam, Chris, Sam은 알파벳 순서대로 정렬되어 뒤따라 나타납니다.

이처럼 MySQL에서는 ORDER BY 절에 조건식을 직접 사용해 특정 조건을 만족하는 행을 우선적으로 정렬할 수 있으며, 두 번째 정렬 기준을 함께 지정하면 원하는 세부 순서까지 손쉽게 제어할 수 있습니다.