如何使用GROUP BY获取每组中的最新记录?

use*_*144 40 mysql sql greatest-n-per-group

假设我有一个messages用列调用的表:

id | from_id | to_id | subject | message | timestamp
Run Code Online (Sandbox Code Playgroud)

我想只收到每个用户的最新消息,就像您在深入了解实际线程之前在FaceBook收件箱中看到的那样.

这个查询似乎让我接近我需要的结果:

SELECT * FROM messages GROUP BY from_id
Run Code Online (Sandbox Code Playgroud)

但是,查询给了我每个用户最早的消息,而不是最新消息.

我无法想出这个.

Dev*_*art 83

您应该找出timestamp每个组(子查询)中的最后一个值,然后将此子查询连接到表中 -

SELECT t1.* FROM messages t1
  JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id) t2
    ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp;
Run Code Online (Sandbox Code Playgroud)

  • +1一个常见的问题,但非常感谢你没有使用MySQL的功能,允许选择中不在组中的列! (4认同)
  • 如果消息表变大,这个查询将会很慢。更好地使用文档页面中的方法:http://dev.mysql.com/doc/refman/5.7/en/example-maximum-column-group-row.html (2认同)

Ven*_*adi 18

试试这个

SELECT * FROM messages where id in (SELECT max(id) FROM messages GROUP BY from_id ) order by id desc
Run Code Online (Sandbox Code Playgroud)

  • 虽然这段代码可以回答这个问题,但最好包含一些_context_,解释_how_它的工作原理和_when_来使用它.从长远来看,仅代码的答案无用. (3认同)
  • 如果您想根据其他一些非主键列获取具有最大值的记录,这可能不起作用。 (2认同)

ley*_*ari 16

此查询为每个 Form_id 返回最后一条记录:

    SELECT m1.*
     FROM messages m1 LEFT JOIN messages m2
     ON (m1.Form_id = m2.Form_id AND m1.id < m2.id)
     WHERE m2.id IS NULL;
Run Code Online (Sandbox Code Playgroud)

  • 老实说,这个答案被低估了。这是唯一对我有用的解决方案,因为除了我的自动增量字段之外,我还按不同的字段分组,而且我必须按日期选择最新的。 (2认同)