Mysql을 공부하면서 특정 컬럼을 그룹으로 나누고 그 그룹별로 상위 N건의 데이터를 출력하는 방법에 대해 알아보았다.
MySQL은 Oracle의 그룹별로 시퀀스 번호를 할당하는 ROW_NUMBER()라는 기능이 제공되지 않아 상위 몇개의 데이터를 추출하기 위해서는 Mysql의 세션 변수를 사용하여 구현할 수 있다.
우선 두 개의 테이블이 존재한다고 가정해보자.
첫 번째 테이블은 사용자 정보를 담고 있는 user 테이블이고 두 번째 테이블은 사용자별 구매정보를 가지고 있는 purchase 테이블이 있다고 가정해보자.
user 테이블
purchase 테이블
결론부터 보여주면 다음과 같다.
위에 내부 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
'데이터베이스 > mysql' 카테고리의 다른 글
Mysql Exists와 IN절 설명과 차이점 (0) | 2018.10.03 |
---|---|
Mysql의 서버엔진과 스토리지 엔진 (0) | 2018.08.10 |
Mysql @variables를 통해 변수 생성 및 대입 연산자 소개 (0) | 2018.07.25 |
논리삭제와 물리삭제 소개 (0) | 2016.12.24 |
Mysql 집계함수 (0) | 2016.12.24 |