Nasıl tüm kullanıcıları karşılaştıran iki alan arasındaki büyük farklılıkları almak için?

4 Cevap php

Ben sütunlar skill1lvl, skill1xp olan bir tablo var, ve 25 becerileri skill1rank. Her gün tüm kullanıcılar için güncelleme, yani bir datetime sütun var. Ben bir yüksek puanlar birçok kullanıcı için bir oyun için izci ilerleme yapıyorum, ve ben bir süre (gün / hafta / ay) belirli bir süre için en yüksek kazançlar Geriye kalan sadece bir özelliği, var.

Ben bu ağır bir soru sanırım, ama ... ben bunu nasıl yapıyor hakkında gitmek istiyorsunuz? = /.

Tablo yapısı: http://pastebin.com/m5903aa17

4 Cevap

if you want to know the Highest Gains for a certain period of time per user, you certainly needs to process data out of SQL stored procedures.
Get all data in a DataTable then find the max value for a period.

Diyelim ki 1 hafta süreyle Max Kazancı bulmak istiyorum diyelim.

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;
      }
}


Next, simply present the start date and period to the user, and the Max Gain of course.
This algorithm can be optimized if you use an array of 7 (daysPeriod) and iterate just once until reach all 15 elements.

Peki, XP kullanıcılarının en az bir "X" bir parçalı yapı kazanmak kaç saklamak gerekir "belirli en XP kimin kazandığını" göstermek için. Kolay çözüm XP size saniye bir "X" vererek, zaman damgası ne kazandı ve saklamak için neredeyse kesinlikle.

create table xprewarded (
  track_users_id int(11) NOT NULL,
  xpreward int(11) NOT NULL,
  rewardtime timestamp NOT NULL DEFAULT NOW()
);

Son bir gün içinde en fazla XP kazanan kişi almak için:

select 
    sum(xpreward), 
    track_users_id 
from xprewarded 
where rewardtime > now()-86400
group by track_users_id 
order by sum(xpreward) desc limit 1;

"Şimdi () -86400" belirten filtre olmak "artık, geriye 86400 saniye (veya '24 saat ') bakmak ve bu noktada beri oluşturulan herhangi bir kaydı döndürür." Diğer süreler benzer matematik ile gerçekleştirilebilir.

Ben istatistikler birini değiştirmek ne zaman track_users tabloya yeni bir kayıt yazmak varsayalım.

Verilen iki tarih ($ START_DATE ve $ END_DATE) arasında bir stat değişiklik olsun, her kullanıcı için aşağıdaki sorguyu kullanabilirsiniz:

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

@ TML: Ben sadece XP, ama herkes için XP, Rank, ve Düzey farklılıkları almak gerekiyor.

@ Pixel3cs:

Yazınızı beni düşünme var. Tüm kullanıcıları ile ben döngü eğer onlar zaten varolan değerinden daha büyük ise, ben bir diziye farklılıkları koyabilirsiniz. Yani, ben bu işe düşünüyorum: http://pastebin.com/m26b60996