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

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

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

如何做到这一点?

表定义,如所请求的:

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

我希望得到类似以下的东西:

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

它给我返回hello,因为hello是按照id排序后,最后一行符合foo = 'bar'的结果。


1
请添加您的表定义,这将有助于其他人。 - Mahesh Madushanka
@MaheshMadushanka 感谢您的提醒,请参考编辑。 - Lucas
1
你如何定义“最后一行”?是基于“id”的最高值吗? - 1000111
@1000111 是的,它将是按id排序的最后一行,因此是具有最高id值的行。 - Lucas
这个问题被反复提问和回答。有些答案是正确的。 - Strawberry
2个回答

4

以下是查询语句:

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演示

在您提供的输入上运行查询,您将获得如下输出:

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

2

使用IN和子查询:

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

SQLFiddle Demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接