我有一个表,其中包含25个技能的列skill1xp、skill1lvl和skill1rank。每天我都为所有用户更新它,所以有一个datetime列。我正在为一款游戏做一个高分的进度跟踪器,对许多用户来说,我只剩下一个功能,那就是某段时间(天/周/月)的最高收益。
我想这是一个沉重的问题,but...how我会这么做吗?
表结构:http://pastebin.com/m5903aa17
发布于 2009-09-25 14:19:04
如果您想知道某段时间内每个用户的的最高收益,那么您肯定需要处理来自SQL存储过程的数据。
获取一个DataTable中的所有数据,然后找到一个周期的最大值。
假设你想要找到一周内的最大收益。
days: 01|02|03|04|05|06|07|08|09|10|11|12|13|14|15
|....................|
|....................|
|....................|
.... etc ...
|....................|
int minDay = 1, daysPeriod = 7, maxDay = 15, maxGain = 0, startDay = 0;
for(int i = minDay; i < maxDay - daysPeriod; i++)
{
int value = 0;
for(int k = 0; k < daysPeriod; i++)
value += (int)dataTable.Rows[i + k]["Gain"];
if(value >= maxGain)
{
maxGain = value;
startDay = i;
}
}接下来,只需向用户显示开始日期和周期,当然还有最大增益。
如果您使用一个7 (daysPeriod)数组,并且只迭代一次,直到达到所有15个元素,则此算法可以进行优化。
发布于 2009-09-25 14:28:24
为了显示“谁在给定时间内赢得了最多的XP ",您需要以至少"X”的粒度存储有多少XP用户获胜。最简单的解决方案几乎肯定是存储XP won和时间戳,给你一个秒的"X“。
create table xprewarded (
track_users_id int(11) NOT NULL,
xpreward int(11) NOT NULL,
rewardtime timestamp NOT NULL DEFAULT NOW()
);要获得在过去一天中赢得最多经验的人:
select
sum(xpreward),
track_users_id
from xprewarded
where rewardtime > now()-86400
group by track_users_id
order by sum(xpreward) desc limit 1;" now ()- 86400“是指定”从现在起,回顾86400秒(或'24小时‘),并返回自那以后创建的任何记录“的过滤器。其他时间段可以用类似的数学方法来完成。
发布于 2009-09-25 14:51:07
@TML:我需要得到每个人的XP,Rank和Level的区别,而不仅仅是XP。
@pixel3cs:
你的帖子让我开始思考。如果我遍历所有用户,如果差值大于已经存在的值,我可以将差值放入一个数组中。所以,我认为这是可行的:http://pastebin.com/m26b60996
https://stackoverflow.com/questions/1477426
复制相似问题