在PHP&基于CodeIgniter的网站,用户可以获得各种操作的声誉,与Stack Overflow不同。每次授予声誉时,都会在MySQL表中创建一个新条目,其中包含user_id
,奖励的行动以及该一堆积分的值(例如,10个声誉)。同时,users
表中的字段reputation_total
会更新。
由于所有这些在没有参考框架的情况下毫无意义,我想向用户展示他们在所有用户中的百分等级。对于总体声誉,这似乎很容易。假设我的user_id
是1138
。只需计算users
表格中reputation_total
小于{4}}的用户数,计算用户总数,然后除以查找信誉低于我的用户百分比。这将是用户1138的百分等级,对吗?简单!
但我也在不同的时间范围内显示声望总数 - 例如,在过去七天内赚取的,其中包括查询声誉表并总结自给定日期以来获得的所有积分。我还希望显示不同时间跨度的百分位数 - 例如,我可能总体上是第11百分位数,但是本月的第50百分位数和今天的第97百分位数。
在给定的时间范围内,似乎我必须查看所有用户的声誉总数,然后看看我属于该组的位置,不是吗?这不是非常麻烦吗?最好的方法是什么?
非常感谢。
答案 0 :(得分:1)
我不明白为什么那太复杂了。通常,您只需要在WHERE子句中添加一个限制结果的查询,如:
WHERE DatePosted between @StartOfRange and @EndOfRange
答案 1 :(得分:1)
我可以在这里想到几个选项:
如您所述,总计在该时间范围内赚取的声誉点数,并根据该值计算百分等级。
每天跟踪Reputation_total的更新 - 因此您有一个包含user_id,date,reputation_total的表。
为每个时间范围的用户表添加一些新列(Reputation_total,reputation_total_today,reputation_total_last30days等)。您还可以将其规范化为单独的表(reputation_totals),以防止您必须为要跟踪的每个时间跨度添加新列。
选项#1是最简单的,但如果您的信誉交易表中有很多行,它可能会变慢 - 它不会很好地扩展,特别是如果您需要实时计算这些行。
选项#2随着时间的推移需要更多存储空间(每个用户每天一行),但可能比直接查询事务表要快得多。
选项#3不太灵活,但可能是最快的选择。
两个选项2& 3可能需要批处理来每天计算总数,所以这也需要考虑。
我认为任何选项都不一定是最好的 - 它们都涉及速度/存储空间/复杂性/灵活性的不同权衡。你所做的将最终取决于你当然的应用要求。