我正在尝试在SELECT查询中进行一些计算,使用用户变量来执行此操作.这很好用,直到我开始使用类似于SUM从连接表中收集数据的函数.
简化示例:
SET @a = 1;
SELECT @a := SUM(1 + 1) AS sum, @a
Run Code Online (Sandbox Code Playgroud)
结果:
+------+------+ | sum | @a | +------+------+ | 2 | 1 | +------+------+
我希望@a在这里是2.
其他例子:
SELECT @b := SUM(1 + 1) AS sum, @b;
Run Code Online (Sandbox Code Playgroud)
+------+------+ | sum | @b | +------+------+ | 2 | NULL | +------+------+
现在它是NULL,因为@b在查询之前没有设置.
看来该变量不会被SUM函数的结果覆盖.有没有什么办法解决这一问题?
如文档中所述:
作为一般规则,您不应该为用户变量赋值并在同一语句中读取值.您可能会得到您期望的结果,但这不能保证.涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改; 此外,MySQL服务器版本之间的订单不保证相同.在SELECT @a, @a:=@a+1, ...,您可能认为MySQL将@a首先进行评估,然后再进行一次分配.然而,改变的声明(例如,通过添加GROUP BY,HAVING或ORDER BY子句)可能引起的MySQL顺序不同的评价,选择的执行计划.
到你问题的第二部分.您可以@variable在这样的查询中初始化您的信息(首先评估子查询):
SELECT @b := SUM(1 + 1) AS sum, @b FROM (SELECT @b:=0) b
Run Code Online (Sandbox Code Playgroud)