2011-06-23 101 views
1

我有一個基本的MySQL查詢:使用PHP訂購一個MySQL查詢結果

$getFeed = "SELECT posts.postID, posts.postTitle, ..... 
FROM posts 
LEFT JOIN users ON posts.userID = users.id 
LEFT JOIN postScore ON posts.postID = postScore.postID   
GROUP BY posts.postID 

$feedResult = mysql_query($getFeed) or die; 
while($row1 = mysql_fetch_array($feedResult)){ 
    $postOwner = $row1["userID"]; 
    $postID = $row1["postID"]; 
    etc... 
}    

所以,現在這裏是我卡住了。我想通過某種投票組合,時間戳等等來使用PHP來訂購feed。基本上創建一個非常簡單的分數算法。我需要使用上面的一些變量來完成數學運算,然後按順序顯示結果。我怎樣才能用PHP做到這一點?

其他問題,我應該用PHP執行此操作還是將算法「分數」保存在數據庫中,然後按該列進行排序?編輯:可以說我把分數存儲在數據庫中,但是這個「分數」將基於對時間敏感的算法(意味着分數會隨着時間的推移而改變)。創建一個間隔運行的後臺腳本來更新數據庫中的所有分數是否合適?

+6

最好的方法可能是將分數保存在數據庫中,然後按該列排序。 – Kokos

+0

你只是想通過postScore訂購帖子,還是要做更多動態/高級的活動? – hughes

+0

我想用時間做更高級的事情,類似於HN的做法。 http://news.ycombinator.com/item?id=1781013 –

回答

1

你通常最好在DB訂購吧。出於以下原因 1.對於php進程,結果集可能太大。 2.數據庫中LIMIT和分頁速度更快。

但是,如果你想做到這一點在PHP,那麼

這裏的格局。首先將記錄獲取到一個數組中,然後使用其中一個PHP排序函數對它們進行排序。

while($row1 = mysql_fetch_array($feedResult)){ 
    $rows[] = $row1; 
} 
usort($rows, 'mycmp'); 

function mycmp($a, $b) 
{ 
    if ($a['score'] == $b['score']) { 
     return 0; 
    } 
    return ($a['score'] < $b['score']) ? -1 : 1; 
} 
3

如果你可以在拉它們之前在MySQL中對它們進行排名,它將會更有效率。在PHP中對中等到大型數據集進行排序是資源密集型的。

0

如果你想這樣做,對飛,看看usort

無論你想存儲這個「成績」在數據庫取決於應用程序的需求。這基本上是存儲空間和速度之間的折衷。如果將它存儲在數據庫中,則會丟失存儲空間,但如果您在運行中計算它,則會失去速度。

雖然在這種特殊情況下,這個小的存儲空間開銷並不值得擔心,並且加速超過了正當理由。

簡短的回答:事先保存得分在數據庫:)