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

MySQL에서 중복 없이 가장 최근 날짜 3개만 조회하는 쿼리 작성법

테이블에서 가장 최근의 날짜를 조회하려면 ORDER BY DESC를 사용해 날짜 레코드를 내림차순으로 정렬하면 됩니다. 그리고 날짜 3개만 필요하므로 LIMIT 3을 함께 사용합니다.

1. 테이블 생성하기

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

mysql> create table DemoTable
(
    AdmissionDate date
);
Query OK, 0 rows affected (0.56 sec)

2. 샘플 데이터 삽입하기

insert 명령을 사용해 테이블에 여러 개의 레코드를 삽입합니다. 이때 의도적으로 중복된 날짜도 함께 넣어 결과를 확인해 보겠습니다.

mysql> insert into DemoTable values('2019-09-04');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('2019-08-10');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('2019-09-21');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('2019-09-18');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2019-09-21');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('2019-08-18');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2019-09-18');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('2019-09-16');
Query OK, 1 row affected (0.10 sec)

3. 전체 레코드 확인하기

select 문을 사용해 테이블의 모든 레코드를 조회합니다.

mysql> select *from DemoTable;

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

+---------------+
| AdmissionDate |
+---------------+
| 2019-09-04    |
| 2019-08-10    |
| 2019-09-21    |
| 2019-09-18    |
| 2019-09-21    |
| 2019-08-18    |
| 2019-09-18    |
| 2019-09-16    |
+---------------+
8 rows in set (0.00 sec)

출력 결과를 보면 '2019-09-21'과 '2019-09-18'이 각각 두 번씩 중복되어 저장된 것을 확인할 수 있습니다.

4. 중복을 제거하고 최근 날짜 3개 조회하기

테이블에서 중복 없이 가장 최근의 날짜 3개를 찾는 쿼리는 다음과 같습니다. 핵심은 서브쿼리에서 DISTINCT로 중복을 먼저 제거한 뒤, 외부 쿼리에서 내림차순 정렬과 LIMIT을 적용하는 것입니다.

mysql> select AdmissionDate from (select distinct AdmissionDate from DemoTable) tbl order by AdmissionDate desc limit 3;

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

+---------------+
| AdmissionDate |
+---------------+
| 2019-09-21    |
| 2019-09-18    |
| 2019-09-16    |
+---------------+
3 rows in set (0.00 sec)

쿼리 동작 원리 정리

이 쿼리는 다음 순서로 동작합니다.

① 내부 서브쿼리 select distinct AdmissionDate from DemoTable가 테이블에서 중복된 날짜를 제거한 고유한 날짜 목록을 만듭니다.
② 외부 쿼리가 이 목록을 ORDER BY AdmissionDate DESC로 내림차순 정렬하여 가장 최근 날짜부터 나열합니다.
③ 마지막으로 LIMIT 3이 상위 3개의 날짜만 반환하도록 제한합니다.

이처럼 DISTINCT와 ORDER BY DESC, LIMIT을 조합하면 중복된 값에 상관없이 항상 고유한 최근 날짜 N개를 안정적으로 조회할 수 있습니다.