2016-06-30 3 views
1

MySQLデータベースから8,000レコードを取得し、各レコードにレーティングを与え、レーティングでデータベースを更新する計算を実行します。ここでPHP内部でのMySQLの更新whileループ

は、私が持っているものです。

require_once('db-connect.php'); 

//---RETRIEVE FROM DB 
mysql_select_db($database_lg, $lg); 
$query_r1 = "SELECT * FROM tblposts WHERE status = 'live'"; 
$r1 = mysql_query($query_r1, $lg) or die(mysql_error()); 
$row_r1 = mysql_fetch_assoc($r1); 

do { 

    $id = $row_r1['id']; 
    $v1 = $row_r1['views']; 
    $v2 = $row_r1['likes']; 
    $v3 = $row_r1['tagcount']; 
    $v4 = $row_r1['dcount']; 
    $v5 = $_POST['content_rating']; 

    $rating = $v1 + $v2 + $v3 + $v4 + $v5; 

    //---UPDATE DB 
    $updateSQL = "UPDATE tblposts SET rating='$rating' WHERE id = '$id'"; 
    mysql_select_db($database_lg, $lg); 
    $Result = mysql_query($updateSQL, $lg) or die(mysql_error()); 

} while ($row_r1 = mysql_fetch_assoc($r1)); 
mysql_free_result($r1); 

が、これはそれを行う方法ですか?この方法で8,000回の更新を行うことでサーバーを煙にすることができますが、より洗練されたソリューションはわかりません。どんな洞察も高く評価されます。

注:mysql_ *関数は廃止予定です。問題になっているサイトでは、もう少し長く住んでいなければなりません。

+2

UPDATE tblposts SET rating = views + likes + tagcount + dcount WHERE status = 'live'' – FirstOne

+1

必要に応じて制限節を含めることもできます。しばしば、別の列をbProcessed = 1に設定した「someDate desc limit 1000による順序付け」を行います。したがってwhere句にはbProcessed = 0部分が含まれます。 – Drew

+0

@FirstOne:ありがとうございます。私はおそらく、評価の計算にはデータベースからではないデータが含まれることに言及すべきであろう。見落として申し訳ありません。変数$ v5を含めるように質問を更新しました。 – blogo

答えて

6

洞察のためにこれはいかがですか?

UPDATE 
    tblposts 
SET 
    rating = views + likes + tagcount + dcount + $value 
WHERE 
    status = 'live'; 

これが意味: "現在liveで各ステータスについて、コラムratingは、PHPの変数viewslikestagcountdcountの合計とします"。あなたのPHPコードのかなり翻訳

これにより、選択とループが不要になります。 DBはあなたのために仕事をしましょう。


あなたがmysql_*を使用しているので、私も、セキュリティおよびその原料についての深いつもりはありません。私は参考のためにここにこれを残しておきます:


そして、そのような do..whileを使用する際に注意してください。少なくとも1回は実行した後でのみチェックするので、結果がない場合は notice/ warningが表示されることがあります。

+0

お時間をありがとう。それは私が思いついたものよりかなりエレガントです。 – blogo