Как я могу использовать несколько наборов для одного запроса на обновление? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь обновить несколько строк с разными значениями, но я хочу использовать только один запрос ОБНОВЛЕНИЕ для быстрого результата ... ниже я пытался выполнить это, но это занимает много времени, и иногда я получаю сообщение об ошибке от браузера, не могу продолжитьВыполнение кода, есть ли какое-нибудь решение?

require_once 'db.php';

$ price = '10000';

if ($ _ 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";
    }

}

}

function TotalViews () {

$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;

}

function UserOldBalance ($ email) {

$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;

}

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я нашел решение для моей проблемы, мне пришлось использовать запрос mysql, как показано ниже:

UPDATE users 
SET balance = ( case  
                when email = '$email1' then '$new_balance1'  
                when email = '$email2' then '$new_balance2' 
               end) 
WHERE email in ('$email2', '$email2')
0 голосов
/ 04 февраля 2019

Ваш текущий код неэффективен, и мы можем попробовать переписать его как отдельный запрос на обновление 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...