2014-09-19 76 views
-1

這裏是我的問題...總和前三名的總數和團體結果來

表看起來像這樣:

|id |coutry |sum 
| 0 | USA  | 30  
| 1 | USA  | 60  
| 2 | USA  | 90  
| 3 | USA  | 80  
| 4 | GER  | 40  
| 5 | GER  | 90  
| 6 | SWE  | 30  
| 7 | SWE  | 10  
| 8 | SWE  | 90  
| 9 | SWE  | 40  

和結果(前三名的成績,如果存在的話)應該是這樣的:

|coutry |total 
| USA  | 230 
| GER  | 130 
| SWE  | 160 

任何更改來解決這個由sql只?我將使用PHP的foreach獲取最終的結果..

+0

你是怎麼做這個工作的?搜索'sql sum',你會發現... – andy 2014-09-19 17:31:44

+3

@andy這比你想像的更復雜。 – Arth 2014-09-19 18:05:30

+1

確實!我沒有注意到問題是選擇每個國家的前三名*,但認爲前三名國家是被要求的。 – andy 2014-09-19 18:10:08

回答

2

limit關鍵字應該做的伎倆:

SELECT country, SUM(`sum`) 
FROM  my_table 
GROUP BY country 
ORDER BY 2 DESC 
LIMIT 3 
+2

我不認爲這會返回正確的結果。這將限制結果返回到3,不限制3個頂部的總和。 – sgeddes 2014-09-19 17:35:04

2

你需要建立一個行數來獲得每個國家的前3名的款項。要使用MySql執行此操作,您必須使用用戶定義的變量。

SELECT country, SUM(`sum`) 
FROM (
    SELECT *, 
     @rn:=IF(@prevCountry=country,@rn+1,1) rn, 
     @prevCountry:=country 
    FROM yourtable, (SELECT @rn:=0, @prevCountry:='') t 
    ORDER BY country, `sum` DESC 
) t 
WHERE rn <= 3 
GROUP BY country 
ORDER BY country 
+0

你實際上並不需要初始化'CROSS JOIN'; IF'適當地處理NULL值。 – Arth 2014-09-19 18:01:45

0

這裏嘗試它,因爲@Mureinik有權。

SQL Fiddle

排序按國家DESC解決 「TOP」 的問題。

+0

謝謝!它最終運作。 – jla 2014-09-20 10:05:20

+0

請標記爲正確的回答問題 – Carca 2014-09-21 15:38:31

+0

對不起,sgeddes是正確的。 – jla 2014-09-22 05:34:47