如何比较所有用户的两个字段之间的最大差异?

时间:2009-09-25 13:55:40

标签: php sql

我有一个表格,其中包含25项技能的技能,包括技能1xp,skill1lvl和skill1rank。每天我都会为所有用户更新它,因此有一个datetime列。对于许多用户来说,我正在为游戏制作一个高分进度跟踪器,而我只剩下一个功能,即一段时间内最高的收益(日/周/月)。

我想这是一个很大的问题,但是......我怎么会这样做呢? = /

表格结构:http://pastebin.com/m5903aa17

4 个答案:

答案 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