=====数据库表=====
[[generated:lb_battle_power_info]] 战力排行 **定时执行mysql事件刷新**。
[[generated:lb_stage_info]] 推图排行 **EndBattle 实时排序**。
[[generated:lb_ladder_info]] 天梯排行 **定时执行mysql事件刷新**。
[[generated:lb_tower_info]] 通天塔 **EndBattle 实时排序**。
[[generated:lb_guild_info]] 公会排行 **定时执行mysql事件刷新**。
每个数据库 __**仅存100条记录**__
=====协议=====
[[generated:GetTopLeaderBoard]] 取得全部排行榜名次 #排行榜#
返回不超过100条数据
[[generated:GetMyLeaderBoard]] 取得我的排行榜名次 #排行榜#
返回一条数据
=====新增客户端表=====
====today_leader_board_info(今日排名信息)====
[[generated:today_leader_board_info]]
暂定使用redis存储,存活周期4小时。
redis key:today_leader_board_info_[character_id]。
刷新排名时机:key 不存在
====character_statistic_info 新增字段 ====
^字段名^描述^类型^默认值^
|**battle_power**|历史最高战力|int|0|
|**ladder_score**|历史最高天梯积分|int|0|
====character_info 新增字段 ====
^字段名^描述^类型^默认值^
|**ladder_score**|本场天梯积分|int|0|
==== character_percentage_rank_sampling_info 角色百分比排名采样表 ====
[[generated:character_percentage_rank_sampling_info]]
//或许可以做原型表//
静态数据
TODO 采样规则:每隔一段时间,根据last_online逆序抽取1000或更多。
==== 公会排名 ====
//TODO
==== 天梯排名 ====
//TODO
==== 通天塔排名 ====
//TODO
==== Mysql存储过程,定时事件 ====
**refresh_leader_board** 刷新lb_*_info ,**同名**定时事件每一小时执行一次
BEGIN
#Routine body goes here...
#最高战力
#lb_battle_power_info
truncate TABLE lb_battle_power_info;
alter table lb_battle_power_info AUTO_INCREMENT=1;
###################################################
#using character_statistic_info.battle_power TODO
###################################################
insert into `lb_battle_power_info`(avatar_url,character_id,`name`,career,battle_power,`level`,stage,tower,ladder_level,ladder_score)
select character_info.avart,character_info.id,character_info.`name`,character_info.career,character_statistic_info.battle_power,character_info.`level`,character_statistic_info.stage_progress,
0,0,0 from character_info,character_statistic_info where character_info.id = character_statistic_info.id and character_statistic_info.battle_power >1 ORDER BY character_statistic_info.battle_power desc limit 100;
update lb_battle_power_info set lb_battle_power_info.`order` = lb_battle_power_info.id;
#主线推图:推到第几关
#lb_stage_info
truncate TABLE lb_stage_info;
alter table lb_stage_info AUTO_INCREMENT=1;
insert into `lb_stage_info`(avatar_url,character_id,`name`,career,battle_power,`level`,stage,tower,ladder_level,ladder_score)
select character_info.avart,character_info.id,character_info.`name`,character_info.career,character_info.battle_power,character_info.`level`,character_statistic_info.stage_progress,
0,0,0 from character_info,character_statistic_info where character_info.id = character_statistic_info.id ORDER BY character_statistic_info.stage_progress%10000 desc limit 100;
update lb_stage_info set lb_stage_info.`order` = lb_stage_info.id;
#王者掠夺:掠夺天梯王者组
#lb_ladder_info
truncate TABLE lb_ladder_info;
alter table lb_ladder_info AUTO_INCREMENT=1;
/*insert into `lb_ladder_info`(avatar_url,character_id,`name`,career,battle_power,`level`,stage,tower,ladder_level,ladder_score)
select character_info.avart,character_info.id,character_info.`name`,character_info.career,character_info.battle_power,character_info.`level`,character_statistic_info.stage_progress,
0,0,0 from character_info,character_statistic_info where character_info.id = character_statistic_info.id ORDER BY character_statistic_info.stage_progress%10000 desc limit 100;
update lb_ladder_info set lb_ladder_info.`order` = lb_stage_info.id;*/
#最强公会:按公会战排名,或者公会等级,或者公会总战力
#lb_guild_info
#TODO
truncate TABLE lb_guild_info;
alter table lb_guild_info AUTO_INCREMENT=1;
#通天塔:看具体设计
#lb_tower_info
#TODO
truncate TABLE lb_tower_info;
alter table lb_tower_info AUTO_INCREMENT=1;
END
**refresh_character_rank** 刷新角色当前排名
BEGIN
declare _battle_power INT DEFAULT(0);
declare _stage_progress INT DEFAULT(0);
declare _ladder_score INT DEFAULT(0);
declare _tower INT DEFAULT(0);
declare _guild_battle_power INT DEFAULT(0);
declare _battle_power_rank float(6,2) DEFAULT(0.00);
declare _stage_progress_rank float(6,2) DEFAULT(0.00);
declare _ladder_rank float(6,2) DEFAULT(0.00);
declare _tower_rank float(6,2) DEFAULT(0.00);
declare _guild_battle_power_rank float(6,2) DEFAULT(0.00);
declare _max_character INT DEFAULT(0);
declare _max_guild INT DEFAULT(0);
#query current status
select character_statistic_info.battle_power,
character_statistic_info.stage_progress,
character_info.ladder_score
#tower TODO
into _battle_power,
_stage_progress,
_ladder_score
#_tower TODO
from character_statistic_info,character_info where character_statistic_info.id = _character_id and character_info.id= _character_id;
#calc rank
select sum(character_percentage_rank_sampling_info.num) into _max_character from character_percentage_rank_sampling_info where character_percentage_rank_sampling_info.type=1;
select lb_battle_power_info.`order` INTO _battle_power_rank from lb_battle_power_info where lb_battle_power_info.character_id=_character_id;
select lb_stage_info.`order` INTO _stage_progress_rank from lb_stage_info where lb_stage_info.character_id=_character_id;
select lb_ladder_info.`order` INTO _ladder_rank from lb_ladder_info where lb_ladder_info.character_id=_character_id;
if(_battle_power_rank=0.00)THEN
select sum(num)/_max_character into _battle_power_rank from character_percentage_rank_sampling_info where character_percentage_rank_sampling_info.battle_power<=_stage_progress and type=1;
end IF;
if(_stage_progress_rank=0.00)THEN
select sum(num)/_max_character into _stage_progress_rank from character_percentage_rank_sampling_info where character_percentage_rank_sampling_info.stage <=_battle_power and type=1;
end IF;
if(_ladder_rank=0.00)THEN
select sum(num)/_max_character into _ladder_rank from character_percentage_rank_sampling_info where character_percentage_rank_sampling_info.ladder_score <=_ladder_score and type=1;
end IF;
#select _battle_power_rank,_stage_progress_rank,_ladder_rank;
#tower TODO
#select lb_tower_info
#guild TODO
select sum(character_percentage_rank_sampling_info.num) into _max_guild from character_percentage_rank_sampling_info where character_percentage_rank_sampling_info.type=2;
#_guild_battle_power TODO
#_guild_battle_power_rank TODO
#update or insert
insert into `today_leader_board_info`(id,battle_power,battle_power_rank,stage_progress,stage_progress_rank,ladder_score,ladder_rank,tower,tower_rank,guild_battle_power,guild_battle_power_rank,last_order_time)
VALUES(_character_id,_battle_power,_battle_power_rank,_stage_progress,_stage_progress_rank,_ladder_score,_ladder_rank,_tower,_tower_rank,_guild_battle_power,_guild_battle_power_rank,now())
ON DUPLICATE KEY UPDATE battle_power=_battle_power,
battle_power_rank=_battle_power_rank,
stage_progress=_stage_progress,
stage_progress_rank=_stage_progress_rank,
ladder_score=_ladder_score,
ladder_rank=_ladder_rank,
tower=_tower,
tower_rank=_tower_rank,
guild_battle_power=_guild_battle_power,
guild_battle_power_rank=_guild_battle_power_rank,
last_order_time=now();
select * from today_leader_board_info where today_leader_board_info.id = _character_id ;
END
==== 公会,天梯,通天塔排名 ====
block