Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询按投递日期或评论日期排序投递_Mysql_Sql_Join_Sql Order By - Fatal编程技术网

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