2013-01-17 52 views
2

我有一個MySQL表,有三列ID,名稱和高度。MySQL的問題在獲得列的平均值

我想運行查詢以返回所有條目的名稱和高度以及所有條目的平均高度。所有這些都必須在單個查詢中完成。

這就是我試過的。

SELECT name, height, avg(height) as average_height FROM mytable 

該查詢只返回一行,但平均高度是正確的。

name height average_height 
-------------------------------- 
Harry 165  169.5 

然後,我嘗試此查詢

SELECT name, height, avg(height) as average_height FROM mytable GROUP BY name 

然後返回所有行,但平均不正確

name height average_height 
-------------------------------- 
Harry 165  165 
Tom  170  170 
George 180  180 
Raj  163  163 

我怎樣才能獲得平均以及所有的單個查詢中的行。

+1

這是兩個不同的功能(聚集和列表)充其量你可以聯合兩個單獨的查詢和黑客的平均值作爲第一個/最後一排,但因爲你是無論如何查找所有的信息,爲什麼不計算MySQL以外的平均值? – Rudu

+0

@Rudu,通過連接或子查詢來產生所需的結果並不難,正如幾個答案所顯示的那樣。從技術的角度來看,這不成問題。雖然目前還不清楚OP爲什麼要這樣做,但有很多情況下這樣的操作是有道理的。例如,如果您想要一個列出相對於平均值的人物高度的列,則需要將每個行的平均高度加入。 – 2013-01-18 08:36:24

回答

6

這裏有一種方法:

SELECT name, height, average_height FROM mytable CROSS JOIN (
    select avg(height) as average_height FROM mytable 
) as avg; 

SQLFiddle example(例如更新,以反映建議使用CROSS JOIN)。

+0

完美!謝謝。 – darsh

2

試試這個:

SELECT name, height, average_height 
FROM mytable, (SELECT AVG(height) average_height FROM mytable) A 

OR

SELECT name, height, (SELECT AVG(height) FROM mytable) AS average_height 
FROM mytable 
2

在第一次查詢過程中,您問的是平均身高,它是打印第一張記錄(哈利)的平均身高。在第二個查詢中,您要求平均分組名稱中的所有學生的平均身高。現在在你的情況下,你有四個組,每個組只包含一條記錄,因爲沒有重複的名字,所以一條記錄的平均高度將作爲記錄本身的高度。

你想要做的是打印每條記錄並反對它,打印平均高度。

SELECT name, height, (SELECT AVG(height) FROM mytable) AS average_height 
FROM mytable;