내 등수 구하기(동점자 처리 포함)

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
반응형