2

我有一张桌子,叫做Posts,还有第二张桌子,叫做Comments。这些通过id帖子表中的postid列和评论表中的列链接。

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

为了做到这一点,我构建了这个简单的查询:

SELECT Posts.id FROM Posts
INNER JOIN Comments ON Posts.id = Comments.postid
ORDER BY Comments.date ASC

不幸的是,这有一个非常明显的问题。如果帖子上没有评论,它将被忽略。如果一个帖子有多个评论,它将在结果中显示多次。

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

4

2 回答 2

3

您需要使用 a ,它仅在 JOIN 成功时LEFT JOIN返回来自 的所有行Posts和来自的行。Comments如果连接不成功,因为没有带有 的注释comments.postid=posts.id,您仍然可以从 中获取所有值Posts,但来自 的值Comments将为 Null。

然后您必须使用GROUP BY,因此每个 ID 只会获得一行,并且您可以使用 MAX() 聚合函数来获取评论表中的最大日期。

如果没有评论,max(comments.date)则为 Null,因此 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
于 2013-02-04T22:48:21.053 回答
1

您需要一个左外连接来考虑可能没有评论:

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
于 2013-02-04T22:49:57.883 回答