Mysql에서 각 유형별 상위 몇건 데이터 가져오는 방법
데이터베이스/mysql

Mysql에서 각 유형별 상위 몇건 데이터 가져오는 방법

반응형

Mysql을 공부하면서 특정 컬럼을 그룹으로 나누고 그 그룹별로 상위 N건의 데이터를 출력하는 방법에 대해 알아보았다.

MySQL은 Oracle의 그룹별로 시퀀스 번호를 할당하는 ROW_NUMBER()라는 기능이 제공되지 않아 상위 몇개의 데이터를 추출하기 위해서는 Mysql의 세션 변수를 사용하여 구현할 수 있다.

우선 두 개의 테이블이 존재한다고 가정해보자.

첫 번째 테이블은 사용자 정보를 담고 있는 user 테이블이고 두 번째 테이블은 사용자별 구매정보를 가지고 있는 purchase 테이블이 있다고 가정해보자.


user 테이블


purchase 테이블


이 때 사용자 ID가 2보다 큰 사용자들을 대상으로 마지막 구매날짜가 최신인 상위 탑 7개를 추출하는 쿼리를 작성해보자.

결론부터 보여주면 다음과 같다.

위에 내부 SELECT 문에 @user_rank := IF(@user_ids = b.user_id, @user_rank + 1, 1) AS user_rank 영역은 각 row의 rank를 만드는 부분이다. 처음에는 @user_ids는 null 이고 @user_rank도 1로 기본 설정이 된다. 

그리고 user_id, updated_at desc로 정렬하게 되면 사용자 별로 업데이트된 시간이 높은순으로 rank가 1, 2, 3, 4. .... 이렇게 올라게 된다. 

 그럼 내부 서브쿼리만 실행되면 모든 랭킹에 대한 데이터가 정렬되어 나올 것이고 그 반환된 서브쿼리 테이블에서 rank가 7이하로 구성된 row만 뽑아내면 된다.

[참조]
각 데이터 베이스별로 해당 방법에 대해 정리되어 있으니 참고하면 좋을 것 같다.

http://www.seobangnim.com/zbxe/?mid=DB&page=3&document_srl=600318


반응형