如何使用PHP/MySQL应用排名算法?

如何使用PHP/MySQL应用排名算法?,php,mysql,algorithm,ranking,Php,Mysql,Algorithm,Ranking,我正在研究一种算法,可以给网站上发布的一些消息打分。此分数将用于对所有邮件进行排名。如果一条消息的得分较高,则该消息的排名将高于其他消息(得分较低的消息),反之亦然。此算法的参数是向上投票/向下投票的数量以及自消息发布以来经过的秒数 我想使用PHP和MySQL在网页上显示数百万条消息。当然,我会使用寻呼系统。由于算法的参数之一是消息发布后经过的秒数,因此该分数将随时间而变化。但我需要更新它。对我来说,更新每条消息的分数的唯一方法是,当客户端要求显示消息时,用PHP自动更新它,然后用类似以下的My

我正在研究一种算法,可以给网站上发布的一些消息打分。此分数将用于对所有邮件进行排名。如果一条消息的得分较高,则该消息的排名将高于其他消息(得分较低的消息),反之亦然。此算法的参数是向上投票/向下投票的数量以及自消息发布以来经过的秒数

我想使用PHP和MySQL在网页上显示数百万条消息。当然,我会使用寻呼系统。由于算法的参数之一是消息发布后经过的秒数,因此该分数将随时间而变化。但我需要更新它。对我来说,更新每条消息的分数的唯一方法是,当客户端要求显示消息时,用PHP自动更新它,然后用类似以下的MySQL请求调用它们:
SELECT*FROM messages ORDER BY score

但是因为有数百万条消息,所以每次有人想看到一些消息时都需要花费大量时间来更新所有内容

如何在PHP中实现这一点

因此,基本上,我在问如何对消息进行排序(使用分数),而不必在调用它们之前计算每条消息的分数(因为这会花费很多时间)+因为我将使用一个寻呼系统,一次只能从数据库中选择20或30条消息


非常感谢您

实时更新将非常困难,而且在性能方面也非常昂贵。但我有一个建议——您可以使用MySQL事件调度器定期调度作业,根据数据库大小,可能每半小时调度一次。定期以cron作业的形式运行批处理脚本也可以,但在MySQL中直接执行事件是更好的选择。 由于排名是根据职位年龄和投票数计算的,所以存储过程可以工作


另一个解决方案,我建议-运行更新查询,以计算结果集上的排名,如分页表单中所示。

创建一个自1970年创建帖子以来保持毫秒的字段。然后使用以下命令:

select milisecondsSince1970 as t,votes as v,* from messages order by (v-a*(t-t0))
其中:

  • “a”是你给“t”赋予期望权重的个人因素
  • <0 > T0是一个确切日期,你认为它是 开始日期而不是1970年

这个解决方案只适用于你的问题,因为分数的标准是“时间”。在其他大型计算中,建议定期更新分数。

欢迎使用SO。请阅读,在没有任何新的向上/向下投票的情况下,在足够长的一段时间后,邮件的分数是否仍然会发生变化?是否可以将此类消息标记为“睡眠消息”,而不需要计算分数更新?您的问题可能对您来说很清楚,但对我们来说并非如此。您可以创建要运行的事件(我的个人资料中有三个链接)。您可以为事件设置日程安排,例如计算分数为null、updt为null或存在与之相关的活动的事件的分数。但在你的问题中,这些都没有得到很好的定义。只是对事物排序的模糊概念。@Arnault:我没想过。与刚刚发布的消息相比,如果这些消息是,比如说2岁,那么它们的分数会非常低。谢谢你的回答。我不知道你可以用一个简单的MySQL查询来做这样的事情。谢谢你的回答。这是一个好主意,但我希望有一天我的网站会流行起来,这样每天都会有很多信息被发送。如果它真的流行起来,那么每天更新我所有的数据库需要很多性能。是的,那么你可以使用数据库集群和NoSQL数据库组合来存储排名。NoSQL数据库可以很好地处理不经常更改的数据。如果你愿意,请投票