【发布时间】: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