2011-08-24 65 views
5

編輯:縮小了問題的範圍。這裏有一個簡單的例子:如何在min/max函數中使用@variable?

mysql> select * from table_a; 
+-------+ 
| col_a | 
+-------+ 
|  1 | 
|  2 | 
|  3 | 
|  4 | 
+-------+ 
4 rows in set (0.00 sec) 

mysql> select @a:=max(col_a),@a from table_a; 
+----------------+------+ 
| @a:=max(col_a) | @a | 
+----------------+------+ 
|    4 | NULL | 
+----------------+------+ 
1 row in set (0.00 sec) 

爲什麼@aNULL,我怎樣才能得到它呢?

+1

我在測試別名的事情時犯了一個愚蠢的錯誤,它給了我一個錯誤的肯定結果,刪除了答案。 – nobody

回答

5

MySql manual是這個很清楚,報價:

作爲一般規則,你不應該賦值給一個用戶變量和讀取同一語句中的價值。您可能會得到您期望的結果,但這並不能保證。包含用戶變量的表達式的評估順序未定義,並可能根據給定語句中包含的元素進行更改;另外,這個順序不能保證在MySQL服務器的版本之間是相同的。在SELECT @a,@a:= @ a + 1,...中,你可能會認爲MySQL會首先評估@a,然後再做一個任務。但是,更改語句(例如,通過添加GROUP BY,HAVING或ORDER BY子句)可能會導致MySQL選擇具有不同評估順序的執行計劃。

1

是不是每個列都按聚合函數返回可以用於大多數情況?

換句話說

,很難猜測你是真正的尋找
(DUN主意時更新問題又來?)

正常使用

select max(col_a) as anything 
from table_a 
order by anything; 

我逼債看對此有任何傷害

select max(col_a) as anything, max(col_a) as anything2, 
from table_a 
order by anything, anything2; 

如果您嘗試荷蘭國際集團使用聚集函數爲LIMIT
這不是可行的從選擇

用戶定義的變量是不可靠的(I 用於是一個風扇)

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

作爲一般規則,您不應該爲用戶變量賦值並讀取同一語句中的值。您可能會得到您期望的結果,但這並不能保證。包含用戶變量的表達式的評估順序未定義,並可能根據給定語句中包含的元素進行更改;另外,這個順序不能保證在MySQL服務器的版本之間是相同的。在SELECT @a,@a:= @ a + 1,...中,你可能會認爲MySQL會首先評估@a,然後再做一個任務。但是,更改語句(例如,通過添加GROUP BY,HAVING或ORDER BY子句)可能會導致MySQL選擇具有不同評估順序的執行計劃。

+0

吧..?你能再解釋一下嗎? 'stamp_date'是一個存儲unix時間戳的「INT」。我想把'MIN(stamp_date)'放到一個變量中,因爲我需要在查詢中重複使用一堆。您的查詢甚至沒有提及'MIN(stamp_date)'。哦.......你正在砍掉第一個stamp_date,這將是最小的,不是嗎?爲什麼會這樣工作,但是'不'? – mpen

+0

好吧,你'substring_index'瘋狂確實檢索到與'MIN'相同的值,但我不明白這是如何解決任何事情。我仍然不能把它放在一個變量中並重新使用它。 – mpen

+0

一旦你有start_time值,你可以使用start_time排序 – ajreal