我正在尝试执行GROUP BY
语句,其中按列分组显示具有最新时间戳的项目。但是,我认为在GROUP BY
声明之前订购是不可能的。下面的子选择是我想要完成的唯一方法吗?
SELECT thread_id, content, timestamp FROM
(
SELECT thread_id, content, timestamp FROM messaging_message
ORDER BY thread_id, timestamp desc
) combined
GROUP BY thread_id
请注意,对于给定的thread_id,可能会有多条与之关联的消息,因此每个content
会有多个timestamps
和thread_id
。
答案 0 :(得分:4)
如果我理解正确并且您希望获得最新的content
thread_id
MAX()
,请使用JOIN
聚合来查找时间戳,并SELECT thread_id, content, timestamp
FROM
messaging_message m
JOIN (
SELECT thread_id, MAX(timestamp) AS maxts
FROM messaging_message
GROUP BY thread_id
) maxt ON m.thread_id = maxt.thread_id AND m.timestamp = maxt.maxts
反对它:
ORDER BY
这种方法根本不会发挥SELECT
的作用。这一切都是通过分组完成的。
与其他RDBMS不同,MySQL并不严格要求您在GROUP BY
中考虑每个SELECT thread_id, content, MAX(timestamp) AS maxts FROM messaging_message GROUP BY thread_id
列,因此您可能只会这样做
JOIN
然而,这不是便携式的,因此我不推荐它。相反,timestamp
子查询会返回thread_id
和content
对。这些用于匹配相关的MAX(timestamp)
以及您可能需要的任何其他列。如果每行都有唯一的ID,您还可以创建一个子查询,该子查询仅返回 每个IN()
的ID,并在thread_id, timestamp
中使用它。但是如果没有这个唯一的ID,那么{{1}}对的联接就可以完成这项工作。