在SQL中实现黑客新闻排名算法

时间:2010-09-24 02:43:13

标签: sql mysql ranking

以下是Paul Graham describes the ranking algorithm for Hacker News

的方式
  

News.YC就是

     

(p-1)/(t + 2)^ 1.5

     

其中p =点,t =年龄

我想在纯mySQL中做到这一点,如下表所示:

  • 表格帖子包含字段postID(索引)和postTime(时间戳)。
  • 表投票的字段为voteID(index),postID和vote(整数,0或1)。

投票领域的想法是可以取消投票。 出于排名的目的,vote = 0相当于没有投票。 (所有投票都是赞成票,没有投票权。)

问题是如何构造一个返回前N个postID的查询,按照Paul Graham的公式排序。 总共大约有10万个帖子,所以如果你认为需要缓存分数或任何东西,我很乐意听到有关这方面的建议。

(显然这不是火箭科学,我当然可以解决这个问题,但我认为有人在早餐,午餐和晚餐时吃过SQL可能会让人感到震惊。而且在StackOverflow上提供它似乎很有价值。)


相关问题:

2 个答案:

答案 0 :(得分:21)

未测试:

  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

答案 1 :(得分: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当新闻发布时