MySQL按联合表中的分组日期排序

时间:2013-02-04 22:45:51

标签: mysql sql sql-order-by

我有一个名为Posts的表和第二个名为Comments的表。它们通过posts表中的id列和评论表中的postid列进行链接。

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

您需要使用LEFT JOIN,仅在JOIN成功时返回Posts的所有行和Comments的行。如果由于comments.postid=posts.id没有评论而导致加入失败,您仍会获得Posts的所有值,但Comments的值将为空。

然后必须使用GROUP BY,因此每个ID只能获得一行,并且可以使用MAX()聚合函数在注释表中获取最大日期。

如果没有评论,max(comments.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

答案 1 :(得分: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