GROUP BY特定订单?

时间:2012-06-09 17:39:10

标签: mysql sql

我正在尝试执行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会有多个timestampsthread_id

1 个答案:

答案 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_idcontent对。这些用于匹配相关的MAX(timestamp)以及您可能需要的任何其他列。如果每行都有唯一的ID,您还可以创建一个子查询,该子查询仅返回 每个IN()的ID,并在thread_id, timestamp中使用它。但是如果没有这个唯一的ID,那么{{1}}对的联接就可以完成这项工作。