PHP while循环中的MySQL更新

PHP while循环中的MySQL更新,php,mysql,while-loop,Php,Mysql,While Loop,我想从MySQL数据库中检索8000条记录,执行一个计算,给每条记录一个评级,然后用评级更新数据库 以下是我所拥有的: 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 di

我想从MySQL数据库中检索8000条记录,执行一个计算,给每条记录一个评级,然后用评级更新数据库

以下是我所拥有的:

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);
这样做吗?在我看来,通过这种方式进行8000次更新,我可以让我的服务器付诸东流,但我不知道还有比这更优雅的解决方案。任何见解都值得赞赏


注意:我意识到mysql_*函数已被弃用。在这个有问题的网站上,我必须和他们一起生活一段时间。

这是一个怎样的见解

UPDATE
    tblposts
SET
    rating = views + likes + tagcount + dcount + $value
WHERE
    status = 'live';
这意味着:“对于当前处于活动状态的每个状态,将列
评级
作为
视图
喜欢
标记计数
数据计数
的总和作为php变量”。基本上是php代码的翻译

这样就不需要进行任何选择和循环。让DB为您做这项工作


因为您使用的是
mysql.*
,所以我甚至没有深入讨论安全性之类的东西。我就把这个放在这里作为参考:

  • -&-


使用
do..时要小心,像那样使用
。由于它只在至少运行一次后进行检查,如果没有结果,您可能会收到一些
通知
/
警告

这是如何获得洞察力的

UPDATE
    tblposts
SET
    rating = views + likes + tagcount + dcount + $value
WHERE
    status = 'live';
这意味着:“对于当前处于活动状态的每个状态,将列
评级
作为
视图
喜欢
标记计数
数据计数
的总和作为php变量”。基本上是php代码的翻译

这样就不需要进行任何选择和循环。让DB为您做这项工作


因为您使用的是
mysql.*
,所以我甚至没有深入讨论安全性之类的东西。我就把这个放在这里作为参考:

  • -&-


使用
do..时要小心,像那样使用
。由于它只在运行至少一次后进行检查,如果没有结果,您可能会收到一些
通知
/
警告

更新tblposts SET rating=views+likes+tagcount+dcount,其中status='live'
如果您愿意,还可以包含一个限制子句。通常我会按someDate desc limit 1000进行
排序,同时将另一列设置为bProcessed=1。。。因此where子句可以包含一个
bProcessed=0
part@FirstOne:谢谢。我可能应该提到,评级的计算将包括数据库以外的数据。抱歉疏忽了。我更新了问题以包含变量$v5。
UPDATE tblposts SET rating=views+likes+tagcount+dcount,其中status='live'
如果需要,还可以包含一个限制子句。通常我会按someDate desc limit 1000进行
排序,同时将另一列设置为bProcessed=1。。。因此where子句可以包含一个
bProcessed=0
part@FirstOne:谢谢。我可能应该提到,评级的计算将包括数据库以外的数据。抱歉疏忽了。我更新了问题,将变量$v5包含在内。谢谢您的时间。这比我想到的要优雅得多。谢谢你的时间。这比我想到的要优雅得多。