Php 流行度算法

Php 流行度算法,php,sql,algorithm,popularity,Php,Sql,Algorithm,Popularity,我正在制作一个类似digg的网站,它将有一个不同类别的主页。我想显示最受欢迎的提交 我们的评级系统就是简单的“喜欢”,比如“我喜欢这个”等等。我们基本上希望每次显示最多“喜欢”的提交。我们想分为三类:最受欢迎、上周和最后一天 有人知道怎么帮你吗?我不知道如何去做这件事,使它更有效率。我想我们可以使用某种cron作业,每10分钟运行一次,并在最后10分钟内获取喜欢的数量……但有人告诉我,这相当低效 帮忙 谢谢 Digg和Reddit类网站通常以提交日期为准,而不是投票时间。通过这种方式,只需一个简

我正在制作一个类似digg的网站,它将有一个不同类别的主页。我想显示最受欢迎的提交

我们的评级系统就是简单的“喜欢”,比如“我喜欢这个”等等。我们基本上希望每次显示最多“喜欢”的提交。我们想分为三类:最受欢迎、上周和最后一天

有人知道怎么帮你吗?我不知道如何去做这件事,使它更有效率。我想我们可以使用某种cron作业,每10分钟运行一次,并在最后10分钟内获取喜欢的数量……但有人告诉我,这相当低效

帮忙


谢谢

Digg和Reddit类网站通常以提交日期为准,而不是投票时间。通过这种方式,只需一个简单的SQL查询就可以找到X时间段的顶级提交。下面是一个伪查询,使用此方法查找过去24小时内最流行的10个链接:

select * from submissions
 where (current_time - post_time) < 86400
 order by score desc limit 10
然后,您可以在X和Y倍之间生成最受欢迎的帖子列表,如下所示:

select sum(vote), post from votes
 where X < time and time < Y
 group by post
 order by sum(vote) desc limit 10;
选择总和(投票),从投票中过账
其中X

从这里开始,您只需跳转、跳过和内部连接,就可以将post数据绑定到返回的ID。

要完成nobody的回答,我建议您阅读(当然,如果您使用的是MySQL)。

您有像样的数据库设置吗?我们可以听听您的
创建表
详细信息和索引吗?假设设置正常,DB应该能够以足够快的速度提取您需要的计数,以满足您的需要!例如(索引和键的净值,这在某种程度上取决于您使用的DB引擎),给定两个表:

CREATE TABLE submissions (subid INT, when DATETIME, etc etc)
CREATE TABLE likes (subid INT, when DATETIME, etc etc)
您可以通过以下方式获得33个最受欢迎的提交

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33
而那些在一定时间范围内投票的人

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
WHERE likes.when BETWEEN initial_time AND final_time
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

如果您在
likes
中存储“投票”(正面或负面),而不是将每个条目都计算为
+1
,您可以简单地使用
SUM(likes.vote)
而不是
COUNT
s.

作为稳定列表,如alltime,lastweek,因为它们不会很快改变,所以我认为应该将列表保存在缓存中,过期时间大约为1天或更长

如果您担心实时计数是否正确,可以通过将页面与缓存中最低的页面进行比较,在每个页面视图中进行检查

您需要做的只是关心缓存和实际数据库之间的同步


当顺序是当前时间的某个函数时,TONGHN查询可能会成为真正的性能问题。如果你可以按日历时间进行存储,并在人们投票时更新每个存储桶的分数,事情就会简单得多。

我写的基本上是一样的,你比我快。=)很好的回答…看起来,虽然你描述的第一种方法更简单,但它不能处理不久前发布的内容突然流行起来的情况(可能是由于最近的新闻事件或其他原因)?第二种方法看起来更健壮,谢谢,我会试试的!我的方法的目标是尽可能地减少数据库查询,因为您不需要一直从数据库中获取顶部…嗯。。什么?
SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
WHERE likes.when BETWEEN initial_time AND final_time
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33