2010-09-24 37 views
11

下面是如何Paul Graham describes the ranking algorithm for Hacker News实施黑客新闻排名算法在SQL

News.YC的仅仅是

(对 - 1)/(T + 2)^ 1.5

其中p =点和t =年龄小时

我想要做的是,在纯粹的MySQL给出如下表:

  • 表带有字段postID(index)和postTime(timestamp)的帖子。
  • 表投票与字段投票ID(索引),postID和投票(整数,0或1)。

投票领域的想法是,投票可以被取消。 为了排名的目的,vote = 0相当于根本没有投票权。 (所有的投票都是upvotes,没有downvotes这样的事情。)

问题是如何构建一个查询返回前N N postIDs,按保罗格雷厄姆的公式排序。 完全有大约10万个帖子,所以如果你认为缓存的分数或任何需要,我很乐意听到关于这方面的建议。 (显然这不是火箭科学,我当然可以弄明白,但我想到一个早餐,午餐和晚餐吃SQL的人可能会听不清楚,而且在StackOverflow上看起来很有价值。)


相关问题:

回答

19

未经测试:

SELECT x.* 
    FROM POSTS x 
    JOIN (SELECT p.postid, 
       SUM(v.vote) AS points 
      FROM POSTS p 
      JOIN VOTES v ON v.postid = p.postid 
     GROUP BY p.postid) y ON y.postid = x.postid 
ORDER BY (y.points - 1)/POW(((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(x.timestamp))/3600)+2, 1.5) DESC 
    LIMIT n 
+0

刚在一个项目上实现了这个功能,似乎到目前为止工作得很好。将做进一步的测试,并将报告。 – Banago 2014-06-13 09:42:59

6
$sql=mysql_query("SELECT * FROM news 
         ORDER BY ((noOfLike-1)/POW(((UNIX_TIMESTAMP(NOW()) - 
         UNIX_TIMESTAMP(created_at))/3600)+2,1.5)) DESC 
       LIMIT 20"); 

此代码对我的作品做一个主页像HN。新闻:是表格名称。

noOfLike:像这个新闻一样的用户总数。

created_at:TimeStamp,当那条消息发布时