61

假设我有一个名为messages列的表:

id | from_id | to_id | subject | message | timestamp

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

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

SELECT * FROM messages GROUP BY from_id

但是,查询给了我来自每个用户的最旧消息,而不是最新消息。

我想不通这个。

4

6 回答 6

113

您应该找出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;
于 2012-06-12T15:18:47.237 回答
31

试试这个

SELECT * FROM messages where id in (SELECT max(id) FROM messages GROUP BY from_id ) order by id desc
于 2016-04-21T18:27:22.303 回答
18

此查询返回每个 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;
于 2017-08-10T07:22:38.530 回答
2

只是补充德瓦特所说的,下面的代码不是根据问题排序的:

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;

“GROUP BY”子句必须在主查询中,因为我们需要首先重新排序“SOURCE”以获得所需的“分组”,所以:

SELECT t1.* FROM messages t1
  JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages ORDER BY timestamp DESC) t2
    ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp GROUP BY t2.timestamp;

问候,

于 2015-09-15T13:53:42.703 回答
1

这是一个标准问题。

请注意,MySQL 允许您从 GROUP BY 子句中省略列,而标准 SQL 不允许这样做,但是当您使用 MySQL 工具时,通常不会获得确定性结果。

SELECT *
  FROM Messages AS M
  JOIN (SELECT To_ID, From_ID, MAX(TimeStamp) AS Most_Recent
          FROM Messages
         WHERE To_ID = 12345678
         GROUP BY From_ID
       ) AS R
    ON R.To_ID = M.To_ID AND R.From_ID = M.From_ID AND R.Most_Recent = M.TimeStamp
 WHERE M.To_ID = 12345678

我在 上添加了一个过滤器To_ID以匹配您可能拥有的内容。没有它,查询也可以工作,但通常会返回更多数据。嵌套查询和外部查询中都不需要声明条件(优化器应该自动将条件下推),但重复显示的条件不会有任何害处。

于 2012-06-12T15:18:57.973 回答
-5

你需要订购它们。

SELECT * FROM messages GROUP BY from_id ORDER BY timestamp DESC LIMIT 1

于 2012-06-12T15:12:14.833 回答