2010-09-24 46 views
11

下面是如何Paul Graham describes the ranking algorithm for Hacker News實施黑客新聞排名算法在SQL

News.YC的僅僅是

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

其中p =點和t =年齡小時

我想要做的是,在純粹的MySQL給出如下表:

  • 錶帶有字段postID(index)和postTime(timestamp)的帖子。
  • 表投票與字段投票ID(索引),postID和投票(整數,0或1)。

投票領域的想法是,投票可以被取消。 爲了排名的目的,vote = 0相當於根本沒有投票權。 (所有的投票都是upvotes,沒有downvotes這樣的事情。)

問題是如何構建一個查詢返回前N N postIDs,按保羅格雷厄姆的公式排序。 完全有大約10萬個帖子,所以如果你認爲緩存的分數或任何需要,我很樂意聽到關於這方面的建議。 (顯然這不是火箭科學,我當然可以弄明白,但我想到一個早餐,午餐和晚餐吃SQL的人可能會聽不清楚,而且在StackOverflow上看起來很有價值。)


相關問題:

回答

19

未經測試:

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 
+0

剛在一個項目上實現了這個功能,似乎到目前爲止工作得很好。將做進一步的測試,並將報告。 – Banago 2014-06-13 09:42:59

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,當那條消息發佈時