我有一个表格,其中包含25项技能的技能,包括技能1xp,skill1lvl和skill1rank。每天我都会为所有用户更新它,因此有一个datetime列。对于许多用户来说,我正在为游戏制作一个高分进度跟踪器,而我只剩下一个功能,即一段时间内最高的收益(日/周/月)。
我想这是一个很大的问题,但是......我怎么会这样做呢? = /
答案 0 :(得分:0)
如果您想知道每个用户一段时间内的最高收益,您当然需要处理SQL存储过程中的数据。
获取DataTable中的所有数据,然后找到一段时间的最大值。
假设您希望在1周内找到最大增益。
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个元素,则可以优化此算法。
答案 1 :(得分:0)
好吧,为了显示“谁赢得了最多的XP”,你需要存储多少XP用户以至少“X”的粒度获胜。最简单的解决方案几乎肯定是存储XP赢得的时间戳和时间戳,给你一个秒的“X”。
create table xprewarded (
track_users_id int(11) NOT NULL,
xpreward int(11) NOT NULL,
rewardtime timestamp NOT NULL DEFAULT NOW()
);
要获得过去一天赢得最多XP的人:
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小时')的过滤器,并返回自该点以来创建的任何记录。”其他时间段可以用类似的数学方法完成。
答案 2 :(得分:0)
@TML:我需要为每个人获取XP,Rank和Level的差异,不仅仅是XP。
@ pixel3cs:
你的帖子让我思考。如果我遍历所有用户,如果它们大于现有值,我可以将差异放入数组中。所以,我认为这样可行:http://pastebin.com/m26b60996
答案 3 :(得分:0)
我假设每当其中一个统计数据发生变化时,你就会在track_users表中写一条新记录。
要在两个给定日期($ START_DATE和$ END_DATE)之间更改统计信息,对于所有用户,您可以使用以下查询:
SELECT a.id, a.date, b.date, b.skill1rank - b.skill1rank AS skill1rank_gain
FROM track_users AS a
INNER JOIN track_users AS b
ON a.date = $START_DATE AND
b.date = $END_DATE AND
a.id = b.id
ORDER BY skill1rank_gain DESC