2010-11-04 92 views
4

我想實現一個網站,我一直在努力,並已決定去與黑客新聞的算法上的排名系統。我選擇這種算法的推理很簡單,因爲它已被描述爲here如何在我的網站中實現排序算法來對數據庫數據進行排序?

我一直在尋找這個Python代碼和無法弄清楚我將如何實現它(我使用建我的網站的語言)。

def calculate_score(votes, item_hour_age, gravity=1.8): 
    return (votes - 1)/pow((item_hour_age+2), gravity) 

鑑於表:

posts: 
    id | title | time_submitted 

votes: 
    id | postid | userid | score 

如何將我拉從數據庫中的數據?理想的解決方案(最有效的)將是構建一個MySQL查詢來檢索使用該算法排名前10位的帖子。但是鑑於黑客新聞已經在Arc中實現了它,這讓我認爲他們將所有帖子都拉出來,然後通過算法對它們進行排序以對它們進行排名。

reddit的也想到這個......他們使用非關係數據庫模式,所以我會認爲他們也像黑客新聞,在他們的代碼進行排名 - 而不是數據庫。

你將如何實現這一點?

編輯:一篇文章可以有很多票,因爲我想記錄哪個用戶在哪個帖子上投票。

+0

是帖子投票一對多關係嗎? – 2010-11-04 01:21:24

+0

是的。我剛剛編輯我的帖子來解釋原因。 – dave 2010-11-04 01:26:17

+0

嗯..在Python中,這將是非常糟糕的,只要性能和編碼實踐去,因爲你將不得不檢索所有帖子和投票並進行比較。 SQL可以做得更快,並只返回你需要的數據... – Joshkunz 2010-11-04 01:33:19

回答

4

你可以使用你所需要的數據ORDER BY條款。

SELECT p.id, p.title, p.time_submitted, SUM(v.score) as num_votes 
    FROM posts p, votes v 
WHERE v.postid = p.id 
GROUP BY p.id 
ORDER BY 
    (SUM(v.score) - 1)/POW(TIMESTAMPDIFF(HOUR,p.time_submitted,NOW()) + INTERVAL 2 HOUR, 1.8) DESC 
LIMIT 100 
+0

非常直接的查詢,歡呼!我會玩一玩。出於好奇,你有什麼想法,爲什麼黑客新聞會使用Arc而不是SQL? Reddit如何將它們的項目排列在非關係模式中? – dave 2010-11-04 01:39:29

+0

@dave,對不起,我不知道。 – 2010-11-04 01:40:59

+0

我試着運行你的查詢,並得到錯誤'附近HOURS,1.8)語法錯誤''。我對您使用的功能不太瞭解,但有些Googleing讓我將其更改爲「INTERVAL 2 HOUR」,而不是「INTERVAL 2 HOURS」。它是否正確? – dave 2010-11-04 02:39:35

0

在你的情況下,票的數量將被退回:

SELECT count(*) FROM votes WHERE postid=<THE POST'S ID>; 

如果你要考慮分數,你可能包括在查詢中,但是你提供的公式是不具備處理它。

該項目小時的年齡是簡單地從提交的時間減去當前時間:

SELECT HOUR(TIMEDIFF(NOW(), time_submitted)) FROM posts WHERE id=<THE POST'S ID>; 

這也可以完全用SQL完成:

SELECT id FROM posts ORDER BY (((SELECT count(*) FROM votes WHERE postid=posts.id) - 1)/MOD(HOUR(TIMEDIFF(NOW(), time_submitted) + INTERVAL 2 HOURS), <GRAVITY>)) LIMIT 10; 
相關問題