Mysql SQL查询按投递日期或评论日期排序投递
我有以下数据库模式Mysql SQL查询按投递日期或评论日期排序投递,mysql,sql,join,sql-order-by,Mysql,Sql,Join,Sql Order By,我有以下数据库模式 posts(id_post, post_content, creation_date) comments(id_comment, id_post, comment_content, creation_date) 我想完成的是查询所有按最近活动日期排序的帖子,这基本上意味着获取的第一篇帖子将是最新添加的帖子或添加了最新评论的帖子 因此,我的第一个想法是 Select * From posts P, comments C WHERE P.id_post=c.id_post GR
posts(id_post, post_content, creation_date)
comments(id_comment, id_post, comment_content, creation_date)
我想完成的是查询所有按最近活动日期排序的帖子,这基本上意味着获取的第一篇帖子将是最新添加的帖子或添加了最新评论的帖子
因此,我的第一个想法是
Select * From posts P, comments C
WHERE P.id_post=c.id_post
GROUP BY P.id_post
ORDER BY C.creation_date
问题在于:如果一篇文章没有注释,它将不会被获取,因为p.id\u post=C.id\u post
将不匹配
基本上,想法如下:我按创建日期排序。如果有评论,creation_date将是评论的创建日期,其他地方将是帖子的创建日期
有什么帮助吗?使用
LEFT JOIN
Select *
,(CASE WHEN C.creation_date IS NULL THEN P.creation_date ELSE C.creation_date END) new_creation_date
From posts P
LEFT JOIN comments C ON (P.id_post=c.id_post)
GROUP BY P.id_post
ORDER BY new_creation_date DESC
SELECT * FROM posts p
LEFT JOIN comments c ON c.id_post = p.id_post
GROUP BY p.id_post
ORDER BY
CASE
WHEN c.creation_date IS NOT NULL THEN c.creation_date ELSE p.creation_date
END
或
首先使用正确的
join
语法。然后返回相应的列。您通过id\u post
进行聚合,因此每个post只有一行。在同一行上发表武断的评论(通常)是不明智的
不过,你的问题的答案是按两个日期中最大的一个排序。这两个日期是p.creation\u date
和`max(c.creation\u date)
由于左侧外部连接
,因此必须使用coalesce()
;注释创建日期可以是NULL
编辑:
如果您假设评论出现在帖子之后,您可以将顺序简化为
:
order by coalesce(max(c.creation_date), P.post_date);
使用适当的
联接表ON
子句、not表1、表2(其中
)联接表
在您的情况下,使用LEFT JOIN
Select *
,(CASE WHEN C.creation_date IS NULL THEN P.creation_date ELSE C.creation_date END) new_creation_date
From posts P
LEFT JOIN comments C ON (P.id_post=c.id_post)
GROUP BY P.id_post
ORDER BY new_creation_date DESC
SELECT * FROM posts p
LEFT JOIN comments c ON c.id_post = p.id_post
GROUP BY p.id_post
ORDER BY
CASE
WHEN c.creation_date IS NOT NULL THEN c.creation_date ELSE p.creation_date
END