这是我的问题。。。
表格如下:
|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获取最终结果。。
limit
关键字应该起作用:
SELECT country, SUM(`sum`)
FROM my_table
GROUP BY country
ORDER BY 2 DESC
LIMIT 3
您需要建立一个行号来获得每个国家的前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
- SQL Fiddle演示
在这里试试,因为@Mureinik有权利。
SQL Fiddle
按国家订单DESC解决"TOP"问题。