게임 운영 시, 매 시즌 상위 랭커에서 보상을 지급 하는 경우가 있다. 이때, 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를 만들고 있다.
'게임을 만들자 > 게임 서버(C#)' 카테고리의 다른 글
c# 다각형 충돌체크 (0) | 2020.02.21 |
---|---|
Mysql, Select결과를 Update 문에 반영하기 (1) | 2020.02.05 |
게임 서버 DB설계 시, Tips (0) | 2020.01.30 |
c# 싱글톤 제네릭 클래스 (0) | 2020.01.07 |
파이썬으로 구글 스프레드시트 다운받고, Json으로 변경하기 (0) | 2019.12.28 |