2015-07-10 22 views
0

我需要根據他們發佈的文章的某些因素來計算用戶的積分。這是一個每小時運行一次的cron工作。用許多foreach循環計算用戶點的有效方法是什麼?

目前,我這是怎麼做的:

  1. 獲取誰已經發布至少1篇文章(以縮小列表)
  2. 對於每個用戶的用戶列表中,選擇他/她從數據庫文章(foreach循環)並進行計算。然後將他/她的觀點更新到數據庫。

基本上,它是這樣的:

$userList = getList(); 

foreach ($userList as $user) 
{ 
    $articleList = getArticles($user); 
    $point = 0; 
    foreach ($articleList as $article) 
    { 
     // Do calculation here 
    } 
    updateUserPoint($point); 
} 

這正常工作。但是,當您訪問大型數據庫(> 10k用戶和> 100k條)時,此腳本運行速度會越來越慢,因爲列表變得越來越長,這些循環需要更長的時間。 MySQL查詢的數量也迅速增加。

請幫助我一個很好的方法來做到這一點。我認爲我的效率不高,不夠好。

非常感謝。

+0

使用'連接'..... – Rikesh

+0

你能請一起分享一些示例數據的表結構嗎? –

+0

@ Code-Monk:謝謝你的時間。請通過以下鏈接找到示例數據:http://pastebin.com/9CG4ZHnF。只需導入並執行它們。 –

回答

0

需要在getArticles函數中更改您的代碼,並且查詢應該使用sum和group_by user_id一起獲取該特定用戶的點總數,然後需要使用updateUserPoint函數中的該用戶ID更新點。

如果您向我提供getArticals函數完成,我將更改該值以獲取該特定用戶的積分總和,然後您可以使用它來更新。

相關問題