如何在我的网站中实现一个排序算法以排序数据库数据?
我想在我正在开发的网站上实现一个排名系统,决定使用Hacker News的算法。选择这个算法的原因很简单,因为在这里有详细的描述。
我在查看这段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个帖子。但是考虑到Hacker News是用Arc实现的,这让我觉得他们可能是先提取所有帖子,然后再通过算法进行排名。
我也想到了Reddit……他们使用的是非关系型数据库,所以我猜他们和Hacker News一样,是在代码中进行排名,而不是在数据库里。
你会怎么实现这个呢?
编辑:一个帖子可以有多个投票,因为我想记录哪个用户对哪个帖子进行了投票。
2 个回答
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;
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