MySQL:选择每个聚合组中的最后一行

时间:2016-07-12 06:02:20

标签: mysql sql aggregate-functions

我想在MySQL中选择每个GROUP BY聚合的最后一行。

例如,如果我写GROUP BY foo,并且两行有foo = 'bar',我想选择这两个行的最后一行(按id排序)(我想要选择每个聚合子句中最后一行的message列,按idGROUP foo排序。

我该怎么做?

表定义,按要求:

+-----------------+
| id  foo message |
+-----------------+
| 1   bar hey     |
| 2   joe hi      |
| 3   bar hello   |
+-----------------+

我希望得到以下内容:

+-------------+
| foo message |
+-------------+
| bar hello   |
| joe hi      |
+-------------+

它给了我hello,因为hellofoo = 'bar'的最后一行,按id排序。

2 个答案:

答案 0 :(得分:3)

以下是查询:

SELECT 
footable.foo,
footable.message
FROM footable
INNER JOIN 
(
    SELECT 
    foo,
    MAX(id) max_id
    FROM footable
    GROUP BY foo
) AS t
ON footable.foo = t.foo AND footable.id = t.max_id
ORDER BY footable.id DESC;

SQL FIDDLE DEMO

在给定输入上运行查询,您将获得如下输出:

| foo | message |
|-----|---------|
| bar |   hello |
| joe |      hi |

答案 1 :(得分:1)

使用IN和子查询:

select *
from yourtable
where (id, foo) in (
    select max(id), foo from yourtable group by foo
)

SQLFiddle Demo