MySQL-在SELECT中定义一个变量并在相同的SELECT中使用它

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

有可能做这种事吗?

SELECT 
    @z:=SUM(item),
    2*@z
FROM
    TableA;

对于第二列,我总是获得NULL。奇怪的是,在做类似的事情的时候

SELECT 
    @z:=someProcedure(item),
    2*@z
FROM
    TableA;

一切照常进行。为什么?

提问于
用户回答回答于

在mysql 5.5工作

select @code:=sum(2), 2*@code

+---------------+---------+
| @code:=sum(2) | 2*@code |
+---------------+---------+
|             2 |       4 |
+---------------+---------+
用户回答回答于

MySQL文献资料在这一点上是很清楚的:

作为一般规则,您不应该将值赋值给用户变量并在同一语句中读取该值。您可能会得到预期的结果,但这并不一定。涉及用户变量的表达式的计算顺序未定义,可能根据给定语句中包含的元素进行更改;此外,此顺序在MySQL服务器的版本之间并不一定相同。在选择@a,@a:=@a+1,……中,您可能会认为MySQL将首先计算@a,然后再执行任务。但是,更改语句(例如,通过添加GROUP BY、HAVY或ORDER BY子句)可能会导致MySQL选择具有不同计算顺序的执行计划。

您可以使用子查询来做您想做的事情:

select @z, @z*2
from (SELECT @z:=sum(item)
      FROM TableA
     ) t;

扫码关注云+社区