2013-02-04 42 views
2

我有一个表,名为Posts,第二个表名为Comments。它们通过posts表中的id列和comments表中的postid列链接。MySQL根据连接表中的分组日期进行排序

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

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

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

不幸的是,这有一个很明显的问题。如果对帖子没有评论,它将被忽略。如果某篇文章有多条评论,则会在结果中显示多次。

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

+0

所以加'Posts.date ASC'到你的'ORDER BY'? – Kermit

回答

3

只有JOIN成功时,您才需要使用LEFT 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 
+0

太好了,谢谢,我不知道聚结。你能否简单解释为什么在这里需要'GROUP BY'子句?我承认并不知道它是如何工作的。 –

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 
相关问题