MySQL 从 PHP 脚本执行时临时变量不起作用
MySQL temporary variable does not work when executed from PHP script
在 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
,则这将 return 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 = . . .
我的猜测是,当您在数据库中 运行 时,变量已经设置为非 NULL 值。
在 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
,则这将 return 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 = . . .
我的猜测是,当您在数据库中 运行 时,变量已经设置为非 NULL 值。