2010-11-04 93 views
4

我想实现一个网站,我一直在努力,并已决定去与黑客新闻的算法上的排名系统。我选择这种算法的推理很简单,因为它已被描述为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的也想到这个......他们使用非关系数据库模式,所以我会认为他们也像黑客新闻,在他们的代码进行排名 - 而不是数据库。

你将如何实现这一点?

编辑:一篇文章可以有很多票,因为我想记录哪个用户在哪个帖子上投票。

+0

是帖子投票一对多关系吗? – 2010-11-04 01:21:24

+0

是的。我刚刚编辑我的帖子来解释原因。 – dave 2010-11-04 01:26:17

+0

嗯..在Python中,这将是非常糟糕的,只要性能和编码实践去,因为你将不得不检索所有帖子和投票并进行比较。 SQL可以做得更快,并只返回你需要的数据... – Joshkunz 2010-11-04 01:33:19

回答

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 
+0

非常直接的查询,欢呼!我会玩一玩。出于好奇,你有什么想法,为什么黑客新闻会使用Arc而不是SQL? Reddit如何将它们的项目排列在非关系模式中? – dave 2010-11-04 01:39:29

+0

@dave,对不起,我不知道。 – 2010-11-04 01:40:59

+0

我试着运行你的查询,并得到错误'附近HOURS,1.8)语法错误''。我对您使用的功能不太了解,但有些Googleing让我将其更改为“INTERVAL 2 HOUR”,而不是“INTERVAL 2 HOURS”。它是否正确? – dave 2010-11-04 02:39:35

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; 
相关问题