SELECT
@frst:= (1)
+
@scnd:= (2) as 'Total',
@frst as 'Frst',
@scndas 'Scnd'
此查询返回3 - 3 - 2而不是3 - 1 - 2.我做错了什么?
答案 0 :(得分:1)
你做错了是在一个表达式中分配变量并使用另一个表达式中的值。 MySQL不保证select
中表达式的评估顺序,因此这不安全。
作为一般规则,除了
SET
语句之外,你永远不应该 为用户变量赋值并读取其中的值 声明。例如,要增加变量,这没关系:SET @a = @a + 1;
对于其他语句,例如
SELECT
,您可能会得到您期望的结果, 但这不能保证。在以下声明中, 你可能会认为MySQL会首先评估@a然后做一个 第二个任务:SELECT @a, @a:=@a+1, ...;
但是,涉及用户变量的表达式的评估顺序 未定义。
答案 1 :(得分:0)
这是你在做什么:
SELECT
@frst:= (1) // *1
+
@scnd:= (2) as 'Total',// *2
@frst as 'Frst',// *3
@scnd as 'Scnd'// *4
就像:
*1 & *2 => set @frst to 1, set @scnd to 2,add and assign to @frst return as total which is 3 (1 + 2)
*3 => @frst as 'Frst' // return 3 as Frst
*4 => @scnd as 'Scnd' // return 2 as Scnd
并且您的查询返回total
,其等于3,Frst
等于3,Scnd
等于2
希望你做对了。