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

dre*_*ves 13 mysql sql ranking

以下是Paul Graham描述黑客新闻排名算法的方法:

News.YC是公正的

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

其中p =点,t =年龄,以小时为单位

鉴于下表,我想在纯mySQL中做到这一点:

  • 表帖子的字段为postID(index)和postTime(timestamp).
  • 表投票的字段为voteID(index),postID和vote(整数,0或1).

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

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

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


相关问题:

OMG*_*ies 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
Run Code Online (Sandbox Code Playgroud)


aya*_*aya 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");
Run Code Online (Sandbox Code Playgroud)

这段代码可以让我创建像HN这样的主页.

新闻:是表名.

noOfLike:此新闻的用户总数.

created_at:TimeStamp,当新闻发布时