2013-03-27 73 views
1

我可以使用在select語句中設置的變量嗎?使用select語句中設置的變量

我想要做這樣的事情(這顯然是不工作):

SELECT 
    YEAR(date_of_spend), 
    @current := SUM(spend_amount), 
    @half := (SUM(spend_amount)/2), 
    (@current - @half) 
FROM `sales_data` 
GROUP BY YEAR(date_of_spend) 

回答

1

號根據MySQL手冊:

作爲一般規則,你不應該賦值給一個用戶變量 和讀取相同的語句中的值。您可能會得到您期望的 結果,但這不能保證。對涉及用戶變量的表達式求值的次序爲 未定義,並且 可能會根據給定語句中包含的元素進行更改; 另外,這個順序不保證在MySQL服務器的 版本之間是一樣的。

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

您需要再次重複表達式或使用子查詢

+0

MySQL會執行兩次計算嗎? – Petah 2013-03-27 22:39:23

+0

這不是一個記錄的優化,所以我不會在這方面算很多,尤其是因爲對優化的關注通常集中在連接上。測試它不應該很難。你也可以選擇使用子查詢來避免雙重計算,但可能需要更多的內存(也取決於優化器)。 – koriander 2013-03-27 23:01:27

-1

只是需要對其進行設置:

SELECT 
    YEAR(date_of_spend), 
    @current := SUM(spend_amount), 
    @half := (SUM(spend_amount)/2), 
    (@current - @half) 
FROM `sales_data`, 
    (SELECT @current := 0, @half := 0) r 
GROUP BY YEAR(date_of_spend) 

See the demo

+0

,只是讓'@current - @ half'返回0。他們正在行3和4 – Petah 2013-03-27 20:59:40

+1

@Petah設置看看[在這個演示](http://sqlfiddle.com/#!2/19182/3)。 – Kermit 2013-03-27 21:01:12

+0

是的我知道如果我改變了出來使用該功能,而不是它會工作的變量。然而,這是一個簡化的例子,在實踐中計算量要大得多。 – Petah 2013-03-27 21:02:40

相關問題