假设我有一个名为 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
"SELECT max(id) FROM messages GROUP BY from_id
" 这个内部查询首先按照用户(from_id)对记录/消息进行分组,然后获取最大的记录id。然后我们再次查询消息表,以仅获取内部查询结果集中的最新记录/消息。此查询返回每个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
上,以匹配你可能拥有的内容。如果没有这个条件,查询仍然可以工作,但通常会返回更多的数据。该条件不需要在嵌套查询和外部查询中都声明(优化器应该会自动将条件下推),但像所示一样重复条件也不会有害。
GROUP BY
中省略列,并将它们包含在 SELECT
或 HAVING
子句中,前提是它们在 GROUP BY
组合上功能依赖 - 因此只会返回确定性结果。(当然,MySQL 不检查这种情况。) - ypercubeᵀᴹ仅补充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" 子句必须在主查询中,因为我们需要首先重新排序 "SOURCE" 以获取所需的 "grouping"。
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
LIMIT 1
吗? - Li0liQ