1

我正在尝试做一个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.

4

1 回答 1

4

如果我理解正确并且您想要最新的contentper 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方法根本不起作用。这一切都是通过分组完成的。

MySQL 与其他 RDBMS 不同,它并不严格要求您将每一SELECT列都考虑在内GROUP BY,因此您可能只是这样做

SELECT thread_id, content, MAX(timestamp) AS maxts FROM messaging_message GROUP BY thread_id

但是,这不是便携式的,所以我不推荐它。相反,子查询返回和JOIN对。这些用于匹配行中您可能需要的相关列和任何其他列。如果您在每一行上都有一个唯一的 id,您还可以创建一个子查询,它只返回每个id并在. 但是,如果没有那个唯一的 id,那么对这对的加入就可以完成这项工作。timestampthread_idcontentMAX(timestamp)IN()thread_id, timestamp

于 2012-06-09T17:43:41.187 回答