MySQL检索Group的最新记录

时间:2012-02-25 12:52:24

标签: mysql sql group-by greatest-n-per-group

我有一个社交网站,我正在努力查询。我有一个帖子表,其中包含所有用户帖子,然后是一个post_comments表,其中包含帖子上的所有评论。我试图通过post_comments表中的帖子找到最新评论。 post_comments表包含以下列:

post_comment_id, POST_ID, writer_user_id, post_comment_content, 日期时间

我按照post_id对结果进行了分组,如下所示:

SELECT * FROM post_comments GROUP BY post_id

这几乎可以满足我的需求,但它总是会返回每个帖子最旧的评论,而不是最新的评论。如何让它返回每个帖子的最新评论?

3 个答案:

答案 0 :(得分:16)

GROUP BY旨在与聚合函数一起使用,否则它会随意为每个组选择一行。你的解决方案(上面和你的自我回答)是有效的,因为MySQL似乎保留了每个组的第一行,但你不能保证这总是会发生。

您可以像这样获得每个post_id的最新评论的日期。

select post_id, MAX(datetime) as latest from post_comments group by post_id

用它来选择最新评论:

SELECT t1.* FROM post_comments AS t1
JOIN (
    SELECT post_id, MAX(datetime) AS latest FROM post_comments GROUP BY post_id
) AS t2
ON t1.post_id = t2.post_id AND t1.datetime = t2.latest

答案 1 :(得分:2)

因为有很多问题出现在“我想要最新的条目......”,并且有一些约会时间。如果有问题的表是自动递增的,并且日期/时间戳将始终保持顺序时间关联...即:用户没有机会编辑或以其他方式更改记录上的时间戳以将今天的条目与日期相关联3个星期前......很多人会继续努力争取最后的约会并重新加入一个无利可图的密钥。只需获取帖子的最大ID密钥并使用...我会在帖子ID和主要自动增量键上有一个索引。

select
      P2.*
   from
      ( select post_id, max( post_comment_id ) as LastPost
           from post_comments
           group by post_id ) LastPerPost
         JOIN post_comments P2
            on LastPerPost.LastPost = P2.post_comment_id

答案 2 :(得分:-3)

排序了!我是这样做的:

SELECT * FROM (
    SELECT * FROM post_comments ORDER BY datetime DESC
) AS post_comments 
GROUP BY post_id