如何在我的网站中实现一个排序算法以排序数据库数据?

4 投票
2 回答
2537 浏览
提问于 2025-04-16 06:32

我想在我正在开发的网站上实现一个排名系统,决定使用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

撰写回答