我有一个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;
是this question
的答案之一,并产生所需的输出:
+---------+---------------+
| 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条警告:
警告| 1287 |在表达式中设置用户变量是 已过时,将在以后的版本中删除。考虑 备选方案:“ SET变量=表达式,...”或“ SELECT表达式” INTO变量”。
使用方法:
替代方案:“ SET variable = expression,...”或“ SELECT” 表达式INTO变量”。
并更改此查询,以便它不会在MySQL8上生成警告?
是否存在有关如何正确地将查询从MySQL5重写到MySQL8的通用指南或建议/示例集,因此MySQL8上没有警告?
我希望通常从MySQL 5到MySQL 8的变量不是唯一需要重写的变量,还有什么?
请注意,问题不在于使用CTE,而是将变量的用法从MySQL 5重写为不会产生任何警告或错误的MySQL 8查询。
这个问题还只是关于在数据库服务器上产生预期的结果,完美地仅需一个查询(如果可能)
答案 0 :(得分:-1)
替代方法是: