在数据库中查找最活跃的论坛帖子或游戏有什么好的指标?
想象一下你运行像4chan这样的论坛。您希望最活跃的线程出现在第一页上。您尝试按last_updated排序主题,但结果是混乱的:您在每次刷新时看到的线程实际上是随机的,跳转到第二页可能会显示许多相同的结果。必须有一个更稳定的算法来确定活动线程!
想象一下,您经营一个人们可以玩和观看游戏的网站。您希望人们在访问首页时看到这些游戏的精彩程度。您的游戏中的互动可以归结为生成单个事件。但是你不能仅仅按照last_updated进行排序,因为有些人玩得很慢,你想找到令人兴奋的游戏。
对于奖励积分,请考虑如何为最大活动构建SQL查询,或者如何在服务器端缓存中实现此查询。最佳答案不需要cron作业来提取数据。
答案 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 1
,page 2
等。)