use*_*579 23 mysql variables select procedure mysql-variables
有没有可能做这样的事情?
SELECT
@z:=SUM(item),
2*@z
FROM
TableA;
Run Code Online (Sandbox Code Playgroud)
对于第二列,我总是得到NULL.奇怪的是,在做某事的同时
SELECT
@z:=someProcedure(item),
2*@z
FROM
TableA;
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.为什么?
Gor*_*off 29
MySQL 文档非常明确:
作为一般规则,您不应该为用户变量赋值并在同一语句中读取值.您可能会得到您期望的结果,但这不能保证.涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改; 此外,MySQL服务器版本之间的订单不保证相同.在SELECT @ a,@ a:= @ a + 1,...中,你可能会认为MySQL会首先评估@a然后再进行一次赋值.但是,更改语句(例如,通过添加GROUP BY,HAVING或ORDER BY子句)可能会导致MySQL选择具有不同评估顺序的执行计划.
您可以使用子查询执行所需操作:
select @z, @z*2
from (SELECT @z:=sum(item)
FROM TableA
) t;
Run Code Online (Sandbox Code Playgroud)