MySQL检索分组中的最新记录

6

我有一个社交网站,正在苦恼一个查询问题。我有一个帖子表来保存所有用户的帖子,还有一个帖子评论表来保存对帖子的所有评论。我想从帖子评论表中找到每个帖子最新的评论。帖子评论表有以下列:

post_comment_id(帖子评论id), post_id(帖子id), writer_user_id(作者用户id), post_comment_content(帖子评论内容), datetime(时间)

我已经按照post_id分组显示结果:

SELECT * FROM post_comments GROUP BY post_id

这个几乎满足我的需求,但它总是返回每篇文章的最早评论而不是最新的评论。我该如何才能使其返回每篇文章的最新评论?

@alexis的回答是最好的...你应该将其标记为已接受,这样这个问题就不会出现在“未回答”列表中。 - Alex D
3个回答

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

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

在某些情况下,例如双主复制,这可能无法正常工作。 - ypercubeᵀᴹ
@ypercube,不熟悉那个术语,并研究后,您是正确的,“按日期”替代方案将是更好的方法。 - DRapp
我不确定在一个服务器上,如果有多个连接插入数据,是否会出现不同的顺序。可能使用时间戳不会出现这种情况,但是使用应用程序提供的日期时间(可能具有不完全同步的时钟)可能会出现。无论如何,您的答案适用于一个服务器(尽管可能不能提供100%准确的结果)。如果效率很重要(并且我们无法在日期时间列上添加其他索引),则这可能是要使用的最佳查询。 - ypercubeᵀᴹ

-3

搞定了!我是这样做的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接