MySQL 5 到 8 查询迁移(重写)- 表达式中的变量

MySQL 5 to 8 query migration (rewrite) - variables within expressions

我有一个 MySQL 5 查询生成所需的输出,但在 MySQL 8 上有警告。

我对变量的查询:

DROP TABLE IF EXISTS test;

CREATE TABLE test
( 
 id SERIAL PRIMARY KEY
 , percent DECIMAL(5,2) NOT NULL
);

INSERT INTO test (percent) VALUES 
(-0.50)
,(0.50)
,(1.00)
,(-0.20)
,(0.50)
,(-1.0)
,(-2.0)
,(0.75)
,(1.0)
,(0.50)
;

SELECT 
    percent,

    CASE @i 
        WHEN 0 THEN ROUND(@i:=(@i+(percent * 1)),2) -1
        ELSE ROUND(@i:=(@i+(percent * ABS(@i))) ,2) -1
    END total_percent

FROM 
    test
    , (SELECT @i:=1) vars         
ORDER 
    BY id; 


的答案之一并产生所需的输出:

+---------+---------------+
| percent | total_percent |
+---------+---------------+
|   -0.50 |         -0.50 |
|    0.50 |         -0.25 |
|    1.00 |          0.50 |
|   -0.20 |          0.20 |
|    0.50 |          0.80 |
|   -1.00 |         -1.00 |
|   -2.00 |         -3.00 |
|    0.75 |         -1.50 |
|    1.00 |         -1.00 |
|    0.50 |         -0.50 |
+---------+---------------+
10 rows in set, 3 warnings (0.00 sec)

但有 3 个警告:

Warning | 1287 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'.

使用方法:

alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'.

并更改此查询,使其不会在 MySQL 8?

上生成警告

是否有关于如何正确重写从 MySQL5 到 MySQL8 的查询的一般指南或 recommendations/examples 集,因此 MySQL 上没有警告8?

我预计一般从MySQL 5到MySQL 8个变量不是唯一需要重写的,那还有什么?


请注意问题不是关于使用 CTE,而是重写变量的用法从 MySQL 5 到 MySQL 8 查询,不会产生任何警告或错误。

此外,此问题仅涉及在数据库服务器上生成预期结果,只需一次查询(如果可能)就可以完美解决

备选方案是:

  1. 使用上一个问题的答案中所示的 CTE。
  2. 将所有结果提取到您的应用程序中并使用代码逐步计算值,而不是 SQL。