13

以下是Paul Graham 如何描述 Hacker News 的排名算法

News.YC的只是

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

其中 p = 点数和 t = 年龄(以小时为单位)

鉴于下表,我想在纯 mySQL 中执行此操作:

  • 具有字段 postID(索引)和 postTime(时间戳)的表 Posts。
  • 带有字段 voteID(索引)、postID 和 vote(整数,0 或 1)的投票表。

投票字段的想法是可以撤销投票。就排名而言,vote=0 相当于根本没有投票。(所有投票都是赞成票,没有反对票。)

问题是如何构造一个返回前 N 个 postID 的查询,按 Paul Graham 的公式排序。总共大约有 100k 个帖子,所以如果您认为需要缓存分数或其他任何内容,我很乐意听取有关此方面的建议。

(显然这不是火箭科学,我当然可以弄清楚,但我认为早餐、午餐和晚餐都吃 SQL 的人可能会喋喋不休。而且在 StackOverflow 上提供似乎很有价值。)


相关问题:

4

2 回答 2

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
于 2010-09-24T03:09:42.117 回答
7
$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 这样的主页。

news:是表名。

noOfLike:喜欢此新闻的用户总数。

created_at:该消息发布时的时间戳

于 2013-04-05T12:49:46.507 回答