对前三个总数求和,并根据对结果进行分组


Sum top three totals and group result by

这是我的问题。。。

表格如下:

|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"问题。