如何计算不同时间跨度点总数的百分等级?

时间:2009-06-17 13:47:34

标签: php mysql math codeigniter

在PHP&基于CodeIgniter的网站,用户可以获得各种操作的声誉,与Stack Overflow不同。每次授予声誉时,都会在MySQL表中创建一个新条目,其中包含user_id,奖励的行动以及该一堆积分的值(例如,10个声誉)。同时,users表中的字段reputation_total会更新。

由于所有这些在没有参考框架的情况下毫无意义,我想向用户展示他们在所有用户中的百分等级。对于总体声誉,这似乎很容易。假设我的user_id1138。只需计算users表格中reputation_total小于{4}}的用户数,计算用户总数,然后除以查找信誉低于我的用户百分比。这将是用户1138的百分等级,对吗?简单!

但我也在不同的时间范围内显示声望总数 - 例如,在过去七天内赚取的,其中包括查询声誉表并总结自给定日期以来获得的所有积分。我还希望显示不同时间跨度的百分位数 - 例如,我可能总体上是第11百分位数,但是本月的第50百分位数和今天的第97百分位数。

在给定的时间范围内,似乎我必须查看所有用户的声誉总数,然后看看我属于该组的位置,不是吗?这不是非常麻烦吗?最好的方法是什么?

非常感谢。

2 个答案:

答案 0 :(得分:1)

我不明白为什么那太复杂了。通常,您只需要在WHERE子句中添加一个限制结果的查询,如:

WHERE DatePosted between @StartOfRange and @EndOfRange

答案 1 :(得分:1)

我可以在这里想到几个选项:

  1. 如您所述,总计在该时间范围内赚取的声誉点数,并根据该值计算百分等级。

  2. 每天跟踪Reputation_total的更新 - 因此您有一个包含user_id,date,reputation_total的表。

  3. 为每个时间范围的用户表添加一些新列(Reputation_total,reputation_total_today,reputation_total_last30days等)。您还可以将其规范化为单独的表(reputation_totals),以防止您必须为要跟踪的每个时间跨度添加新列。

  4. 选项#1是最简单的,但如果您的信誉交易表中有很多行,它可能会变慢 - 它不会很好地扩展,特别是如果您需要实时计算这些行。

    选项#2随着时间的推移需要更多存储空间(每个用户每天一行),但可能比直接查询事务表要快得多。

    选项#3不太灵活,但可能是最快的选择。

    两个选项2& 3可能需要批处理来每天计算总数,所以这也需要考虑。

    我认为任何选项都不一定是最好的 - 它们都涉及速度/存储空间/复杂性/灵活性的不同权衡。你所做的将最终取决于你当然的应用要求。