假设我有一个名为messages
列的表:
id | from_id | to_id | subject | message | timestamp
我只想从每个用户那里获取最新消息,就像您在深入了解实际线程之前在 Facebook 收件箱中看到的那样。
这个查询似乎让我接近我需要的结果:
SELECT * FROM messages GROUP BY from_id
但是,查询给了我来自每个用户的最旧消息,而不是最新消息。
我想不通这个。
假设我有一个名为messages
列的表:
id | from_id | to_id | subject | message | timestamp
我只想从每个用户那里获取最新消息,就像您在深入了解实际线程之前在 Facebook 收件箱中看到的那样。
这个查询似乎让我接近我需要的结果:
SELECT * FROM messages GROUP BY from_id
但是,查询给了我来自每个用户的最旧消息,而不是最新消息。
我想不通这个。
您应该找出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;
试试这个
SELECT * FROM messages where id in (SELECT max(id) FROM messages GROUP BY from_id ) order by id desc
此查询返回每个 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;
只是补充德瓦特所说的,下面的代码不是根据问题排序的:
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;
问候,
这是一个标准问题。
请注意,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
以匹配您可能拥有的内容。没有它,查询也可以工作,但通常会返回更多数据。嵌套查询和外部查询中都不需要声明条件(优化器应该自动将条件下推),但重复显示的条件不会有任何害处。
你需要订购它们。
SELECT * FROM messages GROUP BY from_id ORDER BY timestamp DESC LIMIT 1