php 统计游戏留存数据,游戏玩家的留存率统计实现

玩家在某段时间内注册开始游戏,经过一段时间后,仍然继续游戏的被认作是留存;这部分用户占当时新增用户的比例即是留存率,会按照每隔1单位时间(例日、周、月)来进行统计。顾名思义,留存指的就是“有多少玩家留下来了”。留存用户和留存率体现了应用的质量和保留用户的能力。

次日留存率

首次登陆后第二天登录游戏用户/统计日的注册用户数

三日留存率

首次登陆后第三天登陆过的用户/统计日的注册用户数

七日留存率

首次登陆后第七天登录过游戏的用户/统计日的注册用户数

三十日留存数

首次登陆后第三十天登录过游戏的用户/统计日的注册用户数

留存率 在不同的游戏中 算法不一样

留存率说明

某时间内的新增用户,经过一段时间后,仍继续登录游戏的被认作时留存用户;这部分用户占当时新增用户的比例即是留存率。

例如:

9月5日新增用户200,这200人在6日登录游戏的有100人,7日登录有80人,8日登录有50人;

则9月5日次日留存率是50%,3日留存率是40%,4日留存率是25%。

这是我们游戏里的计算方式

这样统计 有科学根据的

比如 哪天 你开广告了 就可以看 他带来的用户质量

还有 这样的留存 数据 也会好看的

0818b9ca8b590ca3270a3433284dd417.png

-- 登录日志

DROP TABLE IF EXISTS log_login;

CREATE TABLE log_login(

id INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,

player_id INT(11) UNSIGNED NOT NULL,

last_login_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',

register_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',

PRIMARY KEY (id)

)ENGINE=MYISAM DEFAULT CHARSET=utf8;

log_login的数据在每个玩家登陆的时候产生一条,为了接下去的存储过程执行效率的考虑,冗余了每个玩家的注册时间。

-- 统计留存率

DROP TABLE IF EXISTS stat_remain;

CREATE TABLE stat_remain(

id INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,

dru INT(11) NOT NULL, -- 每日新注册用户

second_day INT(11) DEFAULT NULL,

third_day INT(11) DEFAULT NULL,

seventh_day INT(11) DEFAULT NULL,

thirtieth_day INT(11) DEFAULT NULL,

stat_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',

add_time timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',

PRIMARY KEY (id)

)ENGINE=MYISAM DEFAULT CHARSET=utf8;

DELIMITER $$

-- 统计留存率

DROP PROCEDURE IF EXISTS stat_remain_player$$

CREATE PROCEDURE stat_remain_player()

BEGIN

-- 今天的日期

declare today date default curdate();

declare yesterday date default date_sub(today, interval 1 day);

declare days_ago_2 date default date_sub(today, interval 2 day);

declare days_ago_3 date default date_sub(today, interval 3 day);

declare days_ago_4 date default date_sub(today, interval 4 day);

declare days_ago_6 date default date_sub(today, interval 6 day);

declare days_ago_7 date default date_sub(today, interval 7 day);

declare days_ago_13 date default date_sub(today, interval 13 day);

declare days_ago_14 date default date_sub(today, interval 14 day);

declare days_ago_29 date default date_sub(today, interval 29 day);

declare days_ago_30 date default date_sub(today, interval 30 day);

-- 统计昨天DRU(就是昨天一天的注册人数)

insert into stat_remain(dru, stat_time, add_time) select count(id) , yesterday, now() from user where role_num>0 and roll=false and last_login_time>'2000-01-01' and add_time between yesterday and today;

-- 修改前天的2日留存

update stat_remain set second_day = (

select(

(select count(distinct player_id) from log_login where (register_time between days_ago_2 and yesterday) and (last_login_time between yesterday and today))

/

(select count(distinct player_id) from log_login where (register_time between days_ago_2 and yesterday))

)

) where stat_time = days_ago_2;

-- 修改大前天的3日留存

update stat_remain set third_day = (

select(

(select count(distinct player_id) from log_login where (register_time between days_ago_3 and days_ago_2) and (last_login_time between yesterday and today))

/

(select count(distinct player_id) from log_login where (register_time between days_ago_3 and days_ago_2))

)

) where stat_time = days_ago_3;

-- 7日留存

update stat_remain set seventh_day = (

select(

(select count(distinct player_id) from log_login where (register_time between days_ago_7 and days_ago_6) and (last_login_time between yesterday and today))

/

(select count(distinct player_id) from log_login where (register_time between days_ago_7 and days_ago_6))

)

) where stat_time = days_ago_7;

-- 14日留存

update stat_remain set fourteen_day = (

select(

(select count(distinct player_id) from log_login where (register_time between days_ago_14 and days_ago_13) and (last_login_time between yesterday and today))

/

(select count(distinct player_id) from log_login where (register_time between days_ago_14 and days_ago_13))

)

) where stat_time = days_ago_14;

-- 30日留存

update stat_remain set thirtieth_day = (

select(

(select count(distinct player_id) from log_login where (register_time between days_ago_30 and days_ago_29) and (last_login_time between yesterday and today))

/

(select count(distinct player_id) from log_login where (register_time between days_ago_30 and days_ago_29))

)

) where stat_time = days_ago_30;

END

$$

DELIMITER ;

stat_remain_player 存储过程在每新的一天的0点0分1秒左右去执行,生成stat_remain数据,并对离当天stat_time差距为1天,2天,6天和29天的记录进行更新。

流子

QQ:41157121

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值