查找最活跃的主题或游戏

时间:2009-06-01 06:46:06

标签: sql algorithm

在数据库中查找最活跃的论坛帖子或游戏有什么好的指标?

想象一下你运行像4chan这样的论坛。您希望最活跃的线程出现在第一页上。您尝试按last_updated排序主题,但结果是混乱的:您在每次刷新时看到的线程实际上是随机的,跳转到第二页可能会显示许多相同的结果。必须有一个更稳定的算法来确定活动线程!

想象一下,您经营一个人们可以玩和观看游戏的网站。您希望人们在访问首页时看到这些游戏的精彩程度。您的游戏中的互动可以归结为生成单个事件。但是你不能仅仅按照last_updated进行排序,因为有些人玩得很慢,你想找到令人兴奋的游戏。

对于奖励积分,请考虑如何为最大活动构建SQL查询,或者如何在服务器端缓存中实现此查询。最佳答案不需要cron作业来提取数据。

5 个答案:

答案 0 :(得分:1)

在论坛示例中,最热线程基于发布的评论,因此您只需计算当前日/周/月发布的评论数(无论您决定构成“热门”的时间范围),并根据此

SELECT p.id, p.title, COUNT(c.created_at) as count
FROM posts p, comments c
WHERE p.id = c.post_id
AND c.created_at > ***TIME YOU DETERMINE AS HOT***
GROUP BY p.id, p.title
ORDER BY count DESC

假设您为这些数据模型设置了类似的表格,那么您的游戏场景将是相同的

**请注意您在select中添加的任何内容也必须在group by语句中**

答案 1 :(得分:0)

当然你不能指望last_updated(它自己),你应该对所有时间活动线程使用reply_count / play_count,view_count / plays_count。并且您可能需要为每个游戏添加类似now_playing_count的字段以确定现在最热门的游戏。

答案 2 :(得分:0)

与您的问题有些相关的问题称为“The Britney Spears Problem”,这与在算法上确定热门话题的难度有关。从AI的角度来看,这是一个难题,因为首先,没有固定数量的主题,因此分类是不可能的。由于趋势不时变化,模型需要花时间考虑因素(典型的神经网络不会,除非你在谈论时间延迟神经网络)。最后,什么是热门的而不是主观的,因人而异,这意味着你可能需要考虑到人的过去的兴趣(Collaborative Filtering)。

答案 3 :(得分:0)

伪代码:

选择ID,按主题计数分组和按计数按日期顺序

答案 4 :(得分:-1)

  

您尝试按last_updated排序主题,但结果是混乱的:您在每次刷新时看到的线程实际上是随机的,跳转到第二页可能会显示许多相同的结果。

您可以记住用户点击第一页的确切时间,并按last_updated排序小于或等于该日期:

SELECT  t.id, t.name, p.last_updated
FROM    threads t
JOIN    posts p
ON      p.thread_id = t.id
        AND p.last_updated <= @last_updated
ORDER BY
        p.last_updated DESC

这将为您提供稳定的结果集。

仅在用户刷新首页时更新变量(而不是点击page 1page 2等。)