用SQL实现黑客新闻排名算法
以下是方法: 新闻,YC只是 (p-1)/(t+2)^1.5 式中,p=点数,t=以小时为单位的年龄 考虑到下表,我希望在纯mySQL中实现这一点:用SQL实现黑客新闻排名算法,sql,mysql,ranking,Sql,Mysql,Ranking,以下是方法: 新闻,YC只是 (p-1)/(t+2)^1.5 式中,p=点数,t=以小时为单位的年龄 考虑到下表,我希望在纯mySQL中实现这一点: 带有postID(索引)和POSTIME(时间戳)字段的表POST 表中包含字段voteID(索引)、postID和vote(整数、0或1)的投票 投票区的理念是投票可以取消。 就排名而言,投票=0等于没有投票。 (所有的票都是赞成票,而不是反对票。) 问题是如何构造一个查询,返回按Paul Graham公式排序的前N个postid。 总共大约
- 带有postID(索引)和POSTIME(时间戳)字段的表POST
- 表中包含字段voteID(索引)、postID和vote(整数、0或1)的投票
相关问题:
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
这段代码对我来说可以制作一个像HN这样的主页
新闻:是表名
noOfLike:有多少用户喜欢这条新闻
创建于:TimeStamp,当该新闻发布时,刚刚在一个项目上实现了这一点,到目前为止似乎效果很好。将进行进一步测试并报告。
$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");