比方说,我有一个表称为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;
这是一个标准的问题。
注意,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
以匹配你可能有。 查询将工作,没有它,但一般返回更多的数据。 条件不应该需要两个嵌套查询和外部查询(优化程序自动推送的条件下)进行说明,但可以不伤害到重复的情况,如图所示。
只是补充什么Devart说,下面的代码是不是根据问题订购:
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”子句必须在主查询,因为我们需要先重新排序“源”来获得所需要的“分组”,因此:
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;
问候,
你需要对它们进行排序。
SELECT * FROM messages GROUP BY from_id ORDER BY timestamp DESC LIMIT 1