以下是Paul Graham describes the ranking algorithm for Hacker News:
的方式News.YC就是
(p-1)/(t + 2)^ 1.5
其中p =点,t =年龄
我想在纯mySQL中做到这一点,如下表所示:
投票领域的想法是可以取消投票。 出于排名的目的,vote = 0相当于没有投票。 (所有投票都是赞成票,没有投票权。)
问题是如何构造一个返回前N个postID的查询,按照Paul Graham的公式排序。 总共大约有10万个帖子,所以如果你认为需要缓存分数或任何东西,我很乐意听到有关这方面的建议。
(显然这不是火箭科学,我当然可以解决这个问题,但我认为有人在早餐,午餐和晚餐时吃过SQL可能会让人感到震惊。而且在StackOverflow上提供它似乎很有价值。)
相关问题:
答案 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当新闻发布时