При выполнении следующего запроса в 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();
}
Есть идеи?
Спасибо!
Я уверен, что проблема заключается в отсутствии инициализации переменных. Рассмотрим это выражение:
@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 = . . .
Я предполагаю, что когда вы запускаете это в базе данных, переменные уже были установлены в ненулевые значения.
Других решений пока нет …