我正在创建一个类似digg的网站,该网站将有一个不同类别的主页。我想显示最受欢迎的提交。
我们的评级系统只是“喜欢”,比如“我喜欢这个”等等。我们基本上希望每次显示“喜欢”次数最多的提交。我们希望有三个类别:历史人气,上周和最后一天。
有人知道如何提供帮助吗?我不知道如何做到这一点并使其高效。我认为我们可以使用某种类型的cron-job每10分钟运行一次并且在过去的10分钟内获得喜欢的数量...但我被告知这样效率很低?
帮助?
谢谢!
答案 0 :(得分:9)
通常,Digg和Reddit类网站的提交日期截止日期,而非投票时间。这种方式只需要一个简单的SQL查询来查找X时间段的顶级提交。这是一个伪查询,使用此方法查找过去24小时内最受欢迎的10个链接:
select * from submissions
where (current_time - post_time) < 86400
order by score desc limit 10
基本上,这个查询说找到所有提交的文件,其中从现在到发布的时间之间的秒数小于86400,这在UNIX时间是24小时。
如果您真的想在X时间间隔内衡量受欢迎程度,则需要将每次投票的帖子和时间存储在另一个表中:
create table votes (
post foreign key references submissions(id),
time datetime,
vote integer); -- +1 for upvote, -1 for downvote
然后您可以生成X和Y之间最受欢迎的帖子列表,如下所示:
select sum(vote), post from votes
where X < time and time < Y
group by post
order by sum(vote) desc limit 10;
从这里你只是一个跳跃,跳过和内部联接,而不是将后期数据与返回的id绑定。
答案 1 :(得分:3)
你有一个不错的数据库设置吗?我们能否听到您的CREATE TABLE
详情和指数?假设设置合理,数据库应该能够足够快地提取您需要的计数以满足您的需求!例如(索引和键的网络,在某种程度上取决于您正在使用的数据库引擎),给出两个表:
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
1}} S上。
答案 2 :(得分:0)
对于像alltime,lastweek这样的稳定列表,因为它们不应该变得非常快,所以我认为你应该将列表保存在缓存中,到期时间大约是1天或更长。
如果您实时关注正确的计数,可以通过将页面与缓存中的最低页面进行比较来检查每个页面视图。
您需要做的就是关心缓存和实际数据库之间的同步。
thethanghn
答案 3 :(得分:0)
查询顺序是当前时间的某些功能可能会成为真正的性能问题。如果您可以按日历时间进行操作并在人们投票时更新每个桶的分数,事情会变得更加简单。
答案 4 :(得分:-1)
要完成nobody_的答案,我建议您阅读documentation(如果您当然使用的是MySQL)。