У меня есть запрос 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 предупреждениями:
Предупреждение |1287 |Установка пользовательских переменных в выражениях устарела и будет удалена в следующем выпуске.Рассмотрим альтернативы: 'SET variable = expression, ...' или 'SELECT expression (s) INTO variable (s)'.
Как использовать:
альтернативы: 'SET variable = expression, ...' или 'SELECT expression (s) INTO variable (s)'.
и измените этот запрос, чтобы он не генерировал предупреждения на MySQL8?
Существует ли какое-либо общее руководство или набор рекомендаций / примеров о том, как правильно переписать запрос из MySQL5 в MySQL8, чтобы не было предупреждений о MySQL8?
Я ожидаю, что в целом из MySQL 5 дляПеременные MySQL 8 - не единственные, которые нужно переписать, ну и что еще?
Обратите внимание, что вопрос не в использовании CTE, а в перезаписи использования переменных из MySQL 5 в запрос MySQL 8, который не приводит кЛюбое предупреждение или ошибка.
Также этот вопрос касается исключительно получения ожидаемого результата на сервере БД, идеально всего с одним запросом (если возможно)