내 등수 구하기(동점자 처리 포함)
2016. 5. 20. 19:59ㆍ프로그래밍/MySQL
728x90
반응형
랭킹정보를 관리하다보면 나의 등수만을 보여준다면 내점수 보다 높은 사용자들의 숫자만 알면됩니다.
하지만 이건 Top20등의 상위 등수들만을 보여줄때 사용됩니다. 하지만 내 점수 위아래 +/-5 정도의 등수들을 보여주고자 할경우 특히 동점자들이 많은 경우 쿼리가 상당히 복잡해지네요.
일단 다음과 같은 쿼리로 한번에 내 등수(동점자들은 등록 날짜가 빠른 경우 상위 등수로)를 구할 수 있습니다.
특정 주간 내점수와 같거나 높은 사용자들의 목록을 구하고 그중에서 내아이디가 위치한 row의 순위를 rank값으로 받아냅니다.
참고하시기 바랍니다.
문제 : 랭킹 데이블에서 사용자 ID의 랭킹을 구한다. 단 동점자의 경우 등록 일시에 따라서 빠른 경우 높은 등수로 처리한다.
랭킹 정보는 매주마다 초기화 됩니다.
매주 일요일 00:00:00마다 새로운 주가 시작됩니다.
(write_date>'2016-05-15 00:00:00' and write_date<'2016-05-21 23:59:59')
그리고 period, keyword, app_id, visibility는 상황에 따라서 다양하게 추가하시면 됩니다.
해결 방법 :
SELECT * from (
SELECT *, @rownum := @rownum + 1 AS rank from rank_info, (SELECT @rownum := 0) r WHERE
(period=20 and
(keyword='World' and
(app_id=102 and
((write_date>'2016-05-15 00:00:00' and write_date<'2016-05-21 23:59:59') and (score >= 219 and visibility=1)))))
ORDER BY score DESC, write_date
) as result WHERE uniq_id='M28FD83X'
다양한 분야의 개발을 하다보니 DB설계부터 개발도 하게됬습니다.
위 쿼리가 최선은 아닐수 있습니다. 각자의 환경에 따라서 최적의 쿼리를 개발하시기 바랍니다.
728x90
반응형
'프로그래밍 > MySQL' 카테고리의 다른 글
일일 누적되는 로그테이블에서 DAU수를 구하기 위한 SQL문 (0) | 2016.11.15 |
---|---|
테이블에서 일정 개수 이후의 ROW를 모두 삭제하기 (0) | 2016.09.12 |
특정 그룹에서 나의 랭킹(순위) 구하기 (0) | 2016.01.11 |