【问题标题】:MySQL update inside PHP while loopPHP while 循环内的 MySQL 更新
【发布时间】:2016-06-30 01:07:41
【问题描述】:

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

这是我所拥有的:

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_* 函数已被弃用。在有问题的网站上,我必须与他们一起生活一段时间。

【问题讨论】:

  • UPDATE tblposts SET rating=views+likes+tagcount+dcount WHERE status = 'live'
  • 如果需要,您还可以包含限制条款。通常我会做一个order by someDate desc limit 1000,同时将另一列设置为 bProcessed=1 ...所以 where 子句可以包含一个 bProcessed=0 部分
  • @FirstOne:谢谢。我可能应该提到评级的计算将包括不来自数据库的数据。抱歉疏忽。我更新了问题以包含变量 $v5。

标签: php mysql while-loop


【解决方案1】:

这个怎么样?

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

这意味着:“对于当前为live 的每个状态,将rating 列设为viewslikestagcountdcount 的总和一个 php 变量”。几乎是您的 php 代码的翻译

这消除了对任何选择和循环的需要。让数据库为您完成工作。


由于您使用的是mysql_*,因此我什至不会深入了解安全性和那些东西。我将把它留在这里以供参考:


像这样使用do..while 时要小心。由于它仅在至少运行一次后检查,因此您可能会得到一些 notice/warning 以防万一没有结果。

【讨论】:

  • 感谢您的宝贵时间。这比我想出的要优雅得多。
猜你喜欢
  • 2018-08-17
  • 2020-05-15
  • 1970-01-01
  • 2011-11-30
  • 2013-01-28
  • 1970-01-01
  • 2017-06-28
  • 2017-09-12
  • 2021-12-28
相关资源
最近更新 更多