这是Paul Graham如何描述Hacker News的排名算法:
新闻.YC的只是 (p-1)/(t + 2)^ 1.5 其中p =点,t =年龄(小时)
新闻.YC的只是
(p-1)/(t + 2)^ 1.5
其中p =点,t =年龄(小时)
鉴于下表,我想在纯mySQL中执行此操作:
投票域的想法是可以取消投票。出于排名目的,vote = 0等于完全没有投票。(所有投票均为赞成,无表决权。)
问题是如何构建返回前N个postID(按Paul Graham公式排序)的查询。总共大约有10万个帖子,因此,如果您认为对成绩进行缓存或需要其他任何内容,我很乐意听取有关此方面的建议。
(显然,这不是火箭科学,我当然可以弄清楚,但是我发现吃SQL早餐,午餐和晚餐的人可能会觉得不高兴。而且在StackOverflow上使用它似乎很有价值。)
相关问题:
未经测试:
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