MySQL 运行总计算列消息
Posted
技术标签:
【中文标题】MySQL 运行总计算列消息【英文标题】:MySQL running total computed column message 【发布时间】:2020-12-12 23:50:31 【问题描述】:我正在使用以下查询来计算我的信用卡的流动余额。我的银行在其网站上没有提供运行余额列,所以我使用 SQL 查询自己计算它。此代码适用于我,除了我的 IDE 显示以下警告消息,“在表达式中设置用户变量已被弃用,将在未来版本中删除。考虑替代方案:'SET variable=expression, ...',或'SELECT 表达式 INTO 变量'".
SET @running_sum = 100;
SELECT
post_date,
category,
amount,
(@running_sum := @running_sum + amount) AS running_total
FROM credit_card;
我还注意到 mysql 版本 8 第 9.4 节用户定义变量下的以下语句,“以前的 MySQL 版本可以在 SET 以外的语句中为用户变量赋值。此功能在MySQL 8.0 用于向后兼容,但可能会在未来的 MySQL 版本中删除"。
从这些消息看来,MySQL 不喜欢我在查询 (@running_sum := @running_sum + amount)
中使用此表达式。但是,我不能完全理解我应该如何重写这个查询,这样我才能达到计算运行平衡的相同结果,并符合 MySQL 8 版的代码风格。
提前感谢您的回复。
【问题讨论】:
这能回答你的问题吗? Cumulative sum over a set of rows in mysql 谢谢 Ulrich,我忘记在原始查询中使用 ORDER BY 子句,但它仍然有效,因为我以正确的顺序填充了表中的条目。我仍然同意您的观点,最好使用 ORDER BY 子句来确保以正确的顺序执行计算。我测试了 SUM 窗口函数,但正如您所说,它假设初始值从 0 开始,而不是从某个任意值开始。有没有办法仍然使用 SUM 窗口函数,但先将其初始化为某个起始值。 另外,您知道在计算列中使用这样的表达式 (@running_sum := @running_sum + amount) 的一般问题是什么?在我看来,与使用 SUM 窗口函数相比,这个表达式的作用更容易理解,我仍然需要重新阅读才能更好地理解。 人口的顺序可以对结果集产生影响,但是如果没有ORDER BY
,则允许 DBMS 以它认为合适的任何顺序返回结果集。它可能会以它可以最有效地计算的顺序返回行。这可以是人口的顺序,但也可以是其他任何东西。
不,我不知道如何使用窗口 SUM 函数从 100 开始。这在我看来也是可以在应用程序中轻松完成的事情。
【参考方案1】:
没有ORDER BY
,结果集的顺序是不确定的,您的查询可能会在每次执行时返回不同的结果。
假设结果集应该按post_date
排序并且总和应该从0
(而不是100
)开始,以下基于窗口函数的查询会产生相同的结果集:
SELECT
`post_date`,
`category`,
`amount`,
SUM(`amount`) OVER (ORDER BY `post_date` ASC) AS `running_total`
FROM `credit_card`;
Why the functionality was deprecated:
重要更改:在 SET 以外的语句中设置用户变量 由于此处列出的问题,现已弃用:
涉及用户变量的表达式的求值顺序是 未定义。
变量的默认结果类型基于其在 声明的开头,这可能会产生意想不到的影响 在语句开头保存一种类型的值的变量 在同一个语句中被分配了一个不同类型的新值。
引用变量时的 HAVING、GROUP BY 和 ORDER BY 子句 在选择表达式列表中分配了一个值,不起作用 正如预期的那样,因为表达式是在客户端上评估的,所以 前一行中的陈旧列值可能是 用过。
【讨论】:
以上是关于MySQL 运行总计算列消息的主要内容,如果未能解决你的问题,请参考以下文章
Mysql LEFT JOIN with count 返回未知列
[MySQL]--MySQL表中某个列插入数据总被截断,报编码方式的语法错误,实际是column的not null属性和更改编码语法导致的冲突。