我有一个名为Posts
的表和第二个名为Comments
的表。它们通过posts表中的id
列和评论表中的postid
列进行链接。
两个表都有date
列,这是发布日期。我希望能够根据最新活动对帖子进行排序,因此应根据帖子的日期(如果没有评论)或最新评论的日期对其进行排序。
为了做到这一点,我构建了这个简单的查询:
SELECT Posts.id FROM Posts
INNER JOIN Comments ON Posts.id = Comments.postid
ORDER BY Comments.date ASC
不幸的是,这有一个非常明显的问题。如果帖子没有评论,则会被忽略。如果帖子上有多条评论,则会在结果中多次显示。
如何构建查询以满足这些要求?
答案 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