我想在我一直在研究的网站上实施排名系统,并决定采用黑客新闻算法。我选择这个算法的原因很简单,因为它被描述为here。
我正在查看这个Python代码(我用来构建我的网站的语言)并且无法弄清楚我将如何实现它。
def calculate_score(votes, item_hour_age, gravity=1.8):
return (votes - 1) / pow((item_hour_age+2), gravity)
鉴于表格:
posts:
id | title | time_submitted
votes:
id | postid | userid | score
我如何从数据库中提取数据?理想的解决方案(最有效)是构建一个MySQL查询来检索使用该算法排名的前10个帖子。但鉴于黑客新闻已经在Arc中实现了它,它让我觉得他们拿出所有帖子然后运行它们通过算法对它们进行排名。
Reddit也想到了......他们使用非关系数据库模式,所以我认为他们像Hacker News一样,在他们的代码中执行排名 - 而不是数据库。
你会如何实现这个?
编辑:一个帖子可以有很多票,因为我想记录哪个用户在哪个帖子上投票。
答案 0 :(得分:4)
您可以在ORDER BY
子句中使用所需的数据。
SELECT p.id, p.title, p.time_submitted, SUM(v.score) as num_votes
FROM posts p, votes v
WHERE v.postid = p.id
GROUP BY p.id
ORDER BY
(SUM(v.score) - 1) / POW(TIMESTAMPDIFF(HOUR,p.time_submitted,NOW()) + INTERVAL 2 HOUR, 1.8) DESC
LIMIT 100
答案 1 :(得分:0)
在您的情况下,投票数将由以下方式返回:
SELECT count(*) FROM votes WHERE postid=<THE POST'S ID>;
如果您想考虑分数,可以在查询中包含该分数,但您提供的公式无法处理它。
项目小时年龄只是从提交时间中减去的当前时间:
SELECT HOUR(TIMEDIFF(NOW(), time_submitted)) FROM posts WHERE id=<THE POST'S ID>;
这也可以完全在SQL中完成:
SELECT id FROM posts ORDER BY (((SELECT count(*) FROM votes WHERE postid=posts.id) - 1) / MOD(HOUR(TIMEDIFF(NOW(), time_submitted) + INTERVAL 2 HOURS), <GRAVITY>)) LIMIT 10;