SELECT
@frst:= (1)
+
@scnd:= (2) as 'Total',
@frst as 'Frst',
@scndas 'Scnd'
此查詢返回3 - 3 - 2而不是3 - 1 - 2。我做錯了什麼?SQL Select總和查詢變量
SELECT
@frst:= (1)
+
@scnd:= (2) as 'Total',
@frst as 'Frst',
@scndas 'Scnd'
此查詢返回3 - 3 - 2而不是3 - 1 - 2。我做錯了什麼?SQL Select總和查詢變量
你做錯了什麼是在一個表達式中分配變量並在另一個表達式中使用這些值。 MySQL不保證select
中表達式的評估順序,所以這是不安全的。
這在documentation解釋說:比SET
聲明
作爲一般規則,另一方面,你不應該 值分配給一個用戶變量和相同的 語句中讀出的值。例如,爲了增加一個變量,這是好的:
SET @a = @a + 1;
對於其他的語句,如
SELECT
,你可能會得到結果,你能指望 但這不能保證。在下面的語句, 你可能會認爲,MySQL將評估@a第一,然後做一個 分配第二:SELECT @a, @a:[email protected]+1, ...;
但是,評價涉及用戶變量表達式的順序 是不確定的。
下面是你在做什麼:
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 希望你得到它的權利。
SQL有很多種類,你應該指定你正在使用的版本。 – AJNeufeld