MySQL在联接表中按分组日期排序

MySQL在联接表中按分组日期排序,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我有一个表,叫做Posts,还有一个表,叫做Comments。它们由posts表中的id列和comments表中的postid列链接 这两个表都有一个日期列,即它们发布的日期。我希望能够根据最新活动对我的帖子进行排序,因此如果没有评论或最新评论的日期,它们应该按照帖子的日期进行排序 为此,我构建了以下简单查询: SELECT Posts.id FROM Posts INNER JOIN Comments ON Posts.id = Comments.postid ORDER BY Comment

我有一个表,叫做Posts,还有一个表,叫做Comments。它们由posts表中的id列和comments表中的postid列链接

这两个表都有一个日期列,即它们发布的日期。我希望能够根据最新活动对我的帖子进行排序,因此如果没有评论或最新评论的日期,它们应该按照帖子的日期进行排序

为此,我构建了以下简单查询:

SELECT Posts.id FROM Posts
INNER JOIN Comments ON Posts.id = Comments.postid
ORDER BY Comments.date ASC
不幸的是,这有一个非常明显的问题。如果帖子上没有评论,它将被忽略。如果一篇帖子上有多条评论,它会在结果中多次出现

如何构造查询以满足这些要求?

您需要使用左联接,该联接仅在联接成功时才返回帖子中的所有行和注释中的行。如果由于没有带有comments.postid=posts.id的注释而导致连接失败,则仍然可以从posts获取所有值,但来自comments的值将为Null

然后必须使用GROUPBY,这样每个ID只能得到一行,并且可以使用MAX AGGRATE函数来获得comments表中的最大日期

如果没有注释,maxcomments.date将为空,因此COALESCE将返回Posts.date

最后一个问题是:

SELECT Posts.id
FROM Posts LEFT JOIN Comments
     ON Posts.id = Comments.postid
GROUP BY Posts.id
ORDER BY coalesce(max(Comments.date),Posts.date) ASC
您需要使用左联接,该联接仅在联接成功时才返回帖子中的所有行和注释中的行。如果由于没有带有comments.postid=posts.id的注释而导致连接失败,则仍然可以从posts获取所有值,但来自comments的值将为Null

然后必须使用GROUPBY,这样每个ID只能得到一行,并且可以使用MAX AGGRATE函数来获得comments表中的最大日期

如果没有注释,maxcomments.date将为空,因此COALESCE将返回Posts.date

最后一个问题是:

SELECT Posts.id
FROM Posts LEFT JOIN Comments
     ON Posts.id = Comments.postid
GROUP BY Posts.id
ORDER BY coalesce(max(Comments.date),Posts.date) ASC

您需要一个左外部联接来考虑可能没有注释:

SELECT Posts.id
FROM Posts left JOIN
     Comments
     ON Posts.id = Comments.postid
group by posts.id
ORDER BY coalesce(max(Comments.date), posts.date) ASC

您需要一个左外部联接来考虑可能没有注释:

SELECT Posts.id
FROM Posts left JOIN
     Comments
     ON Posts.id = Comments.postid
group by posts.id
ORDER BY coalesce(max(Comments.date), posts.date) ASC

那么,将Posts.date ASC添加到您的订单中?那么将Posts.date ASC添加到您的订单中?很好,谢谢,我不知道coalesce。你能简要解释一下为什么这里需要GROUPBY子句吗?我承认我真的不知道它是如何工作的。太好了,谢谢,我不知道coalesce。你能简要解释一下为什么这里需要GROUPBY子句吗?我承认我真的不知道它是如何工作的。