2011-06-15 52 views
5

我不知道該怎麼說這個問題,但是在這裏。 我想重複我在查詢中計算出的值來計算另一個值。 變量是我猜想的正確單詞。這裏是我的查詢:Mysql - 重複使用計算得出的值

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,SUM(t2.totalEvents) as Back, 
    ROUND(Entry/Back*100,2) as 'Rate' 
FROM 
    trackReports_daily t1 
.... rest of query ... 

內圓我想使用由SUM(t1.totalEvents)返回的值,但是當我使用Entry我得到這個錯誤​​

如何我還可以得到在那裏值無需重新計算每次這樣的:

ROUND(SUM(t2.totalEvents)/SUM(t1.totalEvents)*100,2) 
+0

相關:http://stackoverflow.com/questions/1368084/can-i-re-use -a-mysql-query-as-a-variable-for-another-field – 2015-09-04 10:03:17

+0

[可以重複使用SELECT查詢中的計算字段嗎?](http://stackoverflow.com/問題/ 6085443/can-i-resuse-a-calculated-field-in-a-select-query) – 2015-09-08 09:12:33

回答

5

你可以使用子查詢:

SELECT label, Entry, Back, ROUND(Entry/Back*100,2) as 'Rate' 
FROM (
    SELECT SUM(t1.totalEvents) as Entry, SUM(t2.totalEvents) as Back, t1.label as label 
    FROM trackReports_daily t1 
    .... rest of query ... 
) as temp; 
+1

這是最快的查詢,謝謝你sir – Ibu 2011-06-15 22:06:14

1

一種選擇是在使用子查詢FROM子句,如:

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,t2.Back, 
    ROUND(t1.Entry/t2.Back*100,2) as 'Rate' 
FROM 
    (SELECT *, SUM(totalEvents) as Entry FROM trackReports_daily) t1 
    (SELECT *, SUM(totalEvents) as Back FROM someTable) t2 
.... rest of query ... 

如果您想在其他查詢中重複使用Rate,那麼它會變得複雜,我不知道這是否具有最佳性能,但我認爲它會按照您在示例中所要求的方式進行。

10

這個例子來看看

select (select @t1:=sum(field1)),(select @t2:=sum(field2)),@t1/@t2 from table 
+0

這個實際上是最好的答案。在MySQL中這很容易,但大多數不知道這個功能的人傾向於使用子查詢。 – 2015-01-30 14:50:52

+1

根據MySQL文檔,「涉及用戶變量的表達式的評估順序未定義」http://dev.mysql.com/doc/refman/5.6/en/user-variables.html此解決方案是否安全? – Andrea 2015-08-11 20:40:18

+1

這不是一個好的做法;結果不能保證。 MySQL手冊:「除了在SET語句中,通常不應該爲用戶變量賦值......」。 「對於其他語句,如SELECT,您可能會得到您期望的結果,但這不能保證」。 – bbe 2016-12-30 12:38:01