我如何可以使用多个集合在一个更新查询?

问题描述 投票:0回答:2

我试图更新不同的值多行,但是我想只用一个快速的结果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;

}

mysqli
2个回答
0
投票

您当前的代码是低效的,我们可以尝试改写为单一的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;

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')
© www.soinside.com 2019 - 2024. All rights reserved.