겨울팥죽 여름빙수

게임 운영 시, 매 시즌 상위 랭커에서 보상을 지급 하는 경우가 있다. 이때, mysql 질의를 통해 상위 % 랭커를 검색해야 한다.

mysql 8.0부터는 [RANK / DENSE_RANK / PERCENT_RANK / ROW_NUMBER] 함수를 제공하지만, 그 이전 버전에서는 사용 할 수 없다. 

 

우선 내가 쓰는 UserPoint의 테이블 구조이다.

id season point play_count
1 2 1000 10
2 2 1001 10

 

 여기서 point 내림차순으로 %를 구한다.

 

 

 

아래 코드는 mysql 8.0 이전 버전에서 상위 % 랭커를 찾을 때 쓰는 질의 예제 이다.

INSERT INTO UserMail (user_id, mail_type, reward_type, data_id, count, title, desc_str)  
	SELECT user_id, 0, 5, 1, 5, 'SERVER_TEXT_RANK_REWARD', 'SERVER_TEXT_RANK_REWARD_DESC' FROM
		(SELECT
                id as user_id,
                @prev := @curr as prev,
                @curr := point as curr,
                @rank := IF(@prev > @curr, @rank+@ties, @rank) AS rank,
                (@rank/@total)*100 as percentrank
		FROM
			(SELECT
                    @curr := null,
                    @prev := null,
                    @rank := 0,
                    @ties := 1,
                    @total := count(*) from UserPoint where play_count > 10 and season = 3) b,
			(SELECT * FROM UserPoint WHERE play_count > 10 and season = 3) c
		ORDER BY
		    point DESC) a 
   	WHERE percentrank > 15 AND percentrank <= 40;

 현재 게임의 시즌이 종료 시, 상위 랭커 순으로 보상을 차별 지급하고 있다.  위 예제는 [UserPoint]의 point 값을 비교해, 상위 15%~40% 내 유저들에게, [UserMail]테이블로 보상을 지급하고 있다.

 

 

@키워드는 변수를 선언하는 것과 비슷하다.

(SELECT
        @curr := null,
        @prev := null,
        @rank := 0,
        @ties := 1,
        @total := count(*) from UserPoint where play_count > 10 and season = 2
    ) b
ORDER BY
    point DESC

위 부분은 플레이 횟수가 10번 이상이고, 시즌2 기록만 내림차순으로 질의하고 있다.

 

SELECT
    id as user_id,
    @prev := @curr as prev,
    @curr := point as curr,
    @rank := IF(@prev > @curr, @rank+@ties, @rank) AS rank,
    (@rank/@total)*100 as percentrank

내림 차순으로 정렬된 기록을 바탕으로, 현재 @rank와 [@rank/@total]을 이용해 percentrank를 만들고 있다.

 

 

 

 

 

profile

겨울팥죽 여름빙수

@여름빙수

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!