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


How to apply a ranking algorithm using PHP/MySQL?

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

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

但是由于有数百万条消息,因此每次有人想要查看某些消息时,都需要花费大量时间来更新所有内容。

如何在 PHP 中实现这一点?

所以基本上,我问如何对消息进行排名(使用分数),而不必在调用它们之前计算每条消息的分数(因为这需要很多时间)+因为我将使用分页系统,一次只会从数据库中选择 20 或 30 条消息。

谢谢

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

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

哪里:

    "
  • a"是您赋予"t"所需权重的个人因素。
  • t0 是来自您认为的确切日期的 miliseocnds开始日期而不是 1970 年。

此解决方案仅适用于您的问题,因为分数的标准是"时间"。在其他大型计算中,建议定期更新分数。

实时更新将很困难,而且在性能方面也很昂贵。但我有建议 - 您可以使用 MySQL 事件调度程序定期安排 JOB,可能每半小时一次,具体取决于数据库大小。定期将批处理脚本作为 cron 作业运行也可能有效,但在 MySQL 中直接执行事件是更好的选择。由于排名是根据职位年龄和投票计算的,因此存储过程将起作用。

我建议的其他解决方案 - 运行更新查询以计算结果集的排名,作为分页形式显示的数据。