Временная переменная MySQL не работает при выполнении из скрипта PHP

При выполнении следующего запроса в MySQL строки обновляются правильно.

UPDATE market SET price = 
CASE 
WHEN 
    @order_price:=(
        @market_price:=(IF(
            market_id = 0, 
            (SELECT value FROM fiat WHERE id = 6), 
            (SELECT value FROM fiat WHERE id = 5)
        ) 
        + 
        (
            (order_percentage_dynamic/100) * @market_price
        ))
    ) < IFNULL(exchange_rate_max, 999999999) AND @market_price > IFNULL(exchange_rate_min, -999999999)
THEN @market_price 
WHEN @order_price > exchange_rate_max AND exchange_rate_max IS NOT NULL THEN exchange_rate_max
WHEN @order_price < exchange_rate_min AND exchange_rate_min IS NOT NULL THEN exchange_rate_min 
END 
WHERE bdynamicorder = true;

Выполнение этого же запроса в скрипте PHP обновляет все строки, но со значением NULL.

if ($update_stmt = $mysqli->prepare($query)) {

    $update_stmt->execute();

}

Есть идеи?

Спасибо!

1 ответ

Решение

Я уверен, что проблема заключается в отсутствии инициализации переменных. Рассмотрим это выражение:

@market_price := (IF(market_id = 0, 
                     (SELECT value FROM fiat WHERE id = 6), 
                     (SELECT value FROM fiat WHERE id = 5)
                    ) + 
                    (order_percentage_dynamic/100) * @market_price
                 )

Если @market_price не был установлен, то это вернется NULL - когда любой аргумент арифметического оператора NULLрезультат NULL,

Одно решение использует дополнительную логику, такую ​​как coalesce():

@market_price := IF(market_id = 0, 
                    (SELECT value FROM fiat WHERE id = 6), 
                    (SELECT value FROM fiat WHERE id = 5)
                   ) + 
                   (order_percentage_dynamic/100) * coalesce(@market_price, 0);

Кроме того, вы можете инициализировать значения с помощью join:

UPDATE market CROSS JOIN
       (select @market_price := 0, @order_price := 0) vars
    SET price =  . . .

Я предполагаю, что когда вы запускаете это в базе данных, переменные уже были установлены в ненулевые значения.

Другие вопросы по тегам