我试图更新不同的值多行,但是我想只用一个快速的结果UPDATE查询..以下是我试过,但它需要很长的时间来执行,有时我在浏览器中获取错误不能继续执行代码,请问有什么解决办法吗?
require_once 'db.php中';
$价格= '10000';
如果($ _ POST){
$sql_query = "SELECT * FROM views_by_user WHERE views > 0";
$db = new database();
$con = $db->dbconnect();
$res = $db->query($con, $sql_query);
if($res){
$total_views = TotalViews();
while($row = mysqli_fetch_assoc($res)){
$email = $row['email'];
$user_views = $row['views'];
$old_balance = UserOldBalance($email);
$percentage = ($user_views / $total_views) * 100;
$percentage = number_format($percentage, 0);
$earned_balance = ($price * $percentage) / 100;
$new_balance = $old_balance + $earned_balance;
$sql_query = "UPDATE users SET balance = '$new_balance' WHERE email = '$email'";
$db = new database();
$con = $db->dbconnect();
$res = $db->query($con, $sql_query);
if($res){
$sql_query = "UPDATE views_by_user SET views = '0' WHERE email = '$email'";
$db = new database();
$con = $db->dbconnect();
$res = $db->query($con, $sql_query);
if($res){
echo "Balance Updated Successfully For " . $email . "<br />";
}
else {
echo "Error Updating Views...";
}
}
else {
echo "Error Updating Balance...";
}
}
}
else {
echo "error";
}
}
}
总的观点函数(){
$sql_query = "SELECT SUM(views) as 'total_views' FROM views_by_user";
$db = new database();
$con = $db->dbconnect();
$res2 = $db->query($con, $sql_query);
if($res2){
while($row2 = mysqli_fetch_assoc($res2)){
$total_views = $row2['total_views'];
}
}
return $total_views;
}
功能UserOldBalance($电子邮件){
$sql_query = "SELECT gems_balance FROM users WHERE email = '$email'";
$db = new database();
$con = $db->dbconnect();
$res3 = $db->query($con, $sql_query);
if($res3){
while($row3 = mysqli_fetch_assoc($res3)){
$old_gems = $row3['gems_balance'];
}
}
return $old_gems;
}
您当前的代码是低效的,我们可以尝试改写为单一的MySQL更新查询。例如,你的第一个查询可以被改写为:
UPDATE users u
SET balance = gems_balance + 10000 * ROUND(views / (SELECT SUM(views) FROM views_by_user));
WHERE email = ?;
仿佛用光标这样就不需要循环在你的桌子。相反,你可以执行一个单独的语句。如果您想更新的只是一个给定的电子邮件,然后绑定一个单值以上?
。如果您想更新整个表,然后只是删除WHERE
条款。
第二个查询,假设你想要把它应用到整个表,只是一个简单的毯子更新:
UPDATE views_by_user
SET views = 0;
我发现我的问题的解决,我不得不使用MySQL查询,如下:
UPDATE users
SET balance = ( case
when email = '$email1' then '$new_balance1'
when email = '$email2' then '$new_balance2'
end)
WHERE email in ('$email2', '$email2')