【问题标题】:MySQL temporary variable does not work when executed from PHP script从 PHP 脚本执行时,MySQL 临时变量不起作用
【发布时间】:2015-03-21 17:33:34
【问题描述】:

在 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();

}

有什么想法吗?

谢谢!

【问题讨论】:

    标签: php mysql variables temporary


    【解决方案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 =  . . .
    

    我的猜测是,当你在数据库上运行这个时,变量已经被设置为非 NULL 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多