2016-03-17 64 views
-1
SELECT 
@frst:= (1) 
+ 
@scnd:= (2) as 'Total', 
@frst as 'Frst', 
@scndas 'Scnd' 

此查詢返回3 - 3 - 2而不是3 - 1 - 2。我做錯了什麼?SQL Select總和查詢變量

+1

SQL有很多種類,你應該指定你正在使用的版本。 – AJNeufeld

回答

1

你做錯了什麼是在一個表達式中分配變量並在另一個表達式中使用這些值。 MySQL不保證select中表達式的評估順序,所以這是不安全的。

這在documentation解釋說:比SET聲明

作爲一般規則,另一方面,你不應該 值分配給一個用戶變量和相同的 語句中讀出的值。例如,爲了增加一個變量,這是好的:

SET @a = @a + 1; 

對於其他的語句,如SELECT,你可能會得到結果,你能指望 但這不能保證。在下面的語句, 你可能會認爲,MySQL將評估@a第一,然後做一個 分配第二:

SELECT @a, @a:[email protected]+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 希望你得到它的權利。