Php 如何计算不同时间段内点数总数的百分位排名?

Php 如何计算不同时间段内点数总数的百分位排名?,php,mysql,math,codeigniter,Php,Mysql,Math,Codeigniter,在基于PHP&CodeIgniter的网站上,用户可以通过各种操作赢得声誉,这与堆栈溢出没有什么不同。每次授予声誉时,都会在MySQL表中创建一个新条目,其中包含用户id、奖励的行为以及该系列积分的值(例如10个声誉)。同时,更新用户表中的一个字段声誉(总计) 由于没有参考框架,所有这些都是毫无意义的,所以我想向用户展示他们在所有用户中的百分比排名。对于整体声誉来说,这似乎很容易。假设我的用户id是1138。只需计算users表中信誉度小于我的用户数,计算用户总数,然后除以信誉度低于我的用户百分

在基于PHP&CodeIgniter的网站上,用户可以通过各种操作赢得声誉,这与堆栈溢出没有什么不同。每次授予声誉时,都会在MySQL表中创建一个新条目,其中包含
用户id
、奖励的行为以及该系列积分的值(例如10个声誉)。同时,更新
用户
表中的一个字段
声誉(总计
)

由于没有参考框架,所有这些都是毫无意义的,所以我想向用户展示他们在所有用户中的百分比排名。对于整体声誉来说,这似乎很容易。假设我的
用户id
1138
。只需计算
users
表中信誉度小于我的用户数,计算用户总数,然后除以信誉度低于我的用户百分比。这就是用户1138的百分位数,对吗?轻松点

但我也会显示不同时间段内的声誉总数——例如,过去七天的收入,这涉及到查询声誉表,并将我自给定日期以来获得的所有积分相加。我还想展示不同时间跨度的百分位排名——例如,我可能总体上是第11个百分位,但本月是第50个百分位,今天是第97个百分位

似乎我必须仔细检查并找到给定时间跨度内所有用户的声誉总数,然后看看我属于那个组,不是吗?这不是很麻烦吗?最好的方法是什么


非常感谢。

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

WHERE DatePosted between @StartOfRange and @EndOfRange

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

  • 正如您所提到的,将在该时间范围内获得的声誉点数相加,并在此基础上计算百分位排名

  • 每天跟踪对reputation_total的更新-因此您有一个包含用户id、日期、reputation_total的表

  • 为每个时间范围向用户表中添加一些新列(信誉度总计、信誉度总计、信誉度总计、信誉度总计、最近30天等)。您还可以将其规范化为一个单独的表(声誉总计),以避免您必须为要跟踪的每个时间跨度添加一个新列

  • 选项#1是最简单的,但是如果声誉事务表中有很多行,它可能会变慢-它的伸缩性不太好,特别是如果您需要实时计算这些行

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

    选项3的灵活性较低,但可能是最快的选项

    两个选项2和3可能需要一个批处理来计算每天的总数,所以这也是一个要考虑的事情。< /P>


    我不认为任何选择都是最好的——它们都涉及速度/存储空间/复杂性/灵活性的不同权衡。当然,您所做的最终取决于应用程序的要求。

    不复杂,不复杂——但我必须为每个用户都这样做,不是吗?虽然这并不复杂,但那不是。。。好。。。慢?你对每个用户都意味着什么?我真的不能说太多,因为我们不知道你的实际查询是什么样子。