代码之家  ›  专栏  ›  技术社区  ›  dreeves

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

  •  13
  • dreeves  · 技术社区  · 14 年前

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

    新闻。YC只是

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

    其中p=点,t=年龄(小时)

    我希望在纯MySQL中完成这项工作,具体如下表所示:

    • 带有字段postid(index)和postfime(timestamp)的表post。
    • 表投票字段voteid(index)、postid和vote(integer、0或1)。

    投票场的概念是可以取消投票。 就排名而言,投票=0等于根本不投票。 (所有投票都是赞成票,而不是反对票。)

    问题是如何构造一个返回前n个postid的查询,按PaulGraham的公式排序。 总共有大约10万个帖子,所以如果你认为需要缓存分数或其他东西,我想听听关于这个的建议。

    (很明显,这不是火箭科学,我当然能弄明白,但我想,早餐、午餐和晚餐吃SQL的人可能会把它搞得一团糟。在StackOverflow上似乎有价值。)


    相关问题:

    2 回复  |  直到 10 年前
        1
  •  21
  •   OMG Ponies    10 年前

      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
    
        2
  •  6
  •   ayalcinkaya    11 年前
    $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");