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

MySQL에서 특정 열 기준으로 그룹화하여 마지막 업데이트 데이터를 조회하는 방법

MySQL에서 여러 개의 레코드가 존재할 때, 특정 열을 기준으로 그룹화하면서 각 그룹의 가장 최근(마지막) 업데이트 값을 가져와야 하는 경우가 자주 있습니다. 이때 GROUP BY 절과 MAX() 집계 함수를 함께 사용하면 손쉽게 해결할 수 있습니다.

1. 테이블 생성하기

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

mysql> create table DemoTable621 (UserName varchar(100),UserEmailId varchar(100),UserLastPost datetime);
Query OK, 0 rows affected (0.59 sec)

2. 샘플 데이터 삽입하기

INSERT 명령을 사용해 테이블에 레코드를 추가합니다. 동일한 사용자(John)의 게시 시간이 서로 다른 두 개의 레코드를 넣어보겠습니다.

mysql> insert into DemoTable621 values('John','John@gmail.com','2019-04-10 11:01:10');
Query OK, 1 row affected (0.47 sec)
mysql> insert into DemoTable621 values('John','John@gmail.com','2019-07-14 13:07:10');
Query OK, 1 row affected (0.15 sec)

3. 전체 레코드 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from DemoTable621;

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

+----------+----------------+---------------------+
| UserName | UserEmailId    | UserLastPost        |
+----------+----------------+---------------------+
| John     | John@gmail.com | 2019-04-10 11:01:10 |
| John     | John@gmail.com | 2019-07-14 13:07:10 |
+----------+----------------+---------------------+
2 rows in set (0.00 sec)

4. 그룹화 후 마지막 업데이트 조회하기

이제 핵심 쿼리입니다. UserNameUserEmailId를 기준으로 그룹화하고, MAX() 함수를 사용해 각 그룹에서 가장 최근의 게시 시간을 조회합니다.

mysql> select UserName,UserEmailId,max(UserLastPost) from DemoTable621 group by UserName,UserEmailId;

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

+----------+----------------+---------------------+
| UserName | UserEmailId    | max(UserLastPost)   |
+----------+----------------+---------------------+
| John     | John@gmail.com | 2019-07-14 13:07:10 |
+----------+----------------+---------------------+
1 row in set (0.19 sec)

결과 분석

위 결과를 보면 원래 두 개의 레코드가 있었지만, UserNameUserEmailId를 기준으로 그룹화한 후에는 하나의 행만 반환되었습니다. 그리고 MAX(UserLastPost) 덕분에 두 날짜 중 더 나중인 2019-07-14 13:07:10, 즉 가장 최근 업데이트 값이 정확하게 조회된 것을 확인할 수 있습니다.

참고 사항

DATETIME 타입은 시간 순서대로 비교되기 때문에 MAX() 함수를 적용하면 항상 가장 늦은 시간이 반환됩니다. 만약 그룹별 최신 레코드의 다른 열들까지 함께 가져오고 싶다면, 서브쿼리나 윈도우 함수(ROW_NUMBER())를 활용하는 방법도 고려할 수 있습니다.