2014-02-22 67 views
0

我有以下的数据库架构SQL查询订购邮寄日期帖子或评论日期

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_post=C.id_post将不匹配。

基本上,这个想法如下:我通过creation_date命令。如果有评论,creation_date将是评论的创建日期,其他地方将是帖子的创建日期。

任何帮助?

回答

1

开始用正确的语法join。然后返回适当的列。您正在汇总id_post,因此每个帖子只有一行。对同一行进行任意评论不会(通常)是明智的做法。

但是,您的问题的答案是按照两个日期中最大的一个排序。这两个日期是p.creation_date和`max(c.creation_date)。

select P.*, max(P.creation_date) 
From posts P left join 
    comments C 
    on P.id_post=c.id_post 
group by P.id_post 
order by greatest(p.creation_date, coalesce(max(c.creation_date), P.post_date)); 

coalesce()是必要的,因为left outer join的;评论创建日期可以是NULL

编辑:

如果您认为帖子后留言来,可以简化order by到:

order by coalesce(max(c.creation_date), P.post_date); 
1

使用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 (P.id_post=c.id_post) 
GROUP BY P.id_post 
ORDER BY 
CASE WHEN C.creation_date IS NULL THEN P.creation_date ELSE C.creation_date END 
DESC 
0

使用适当JOIN table ON条款,table1, table2 WHERE加入表。

在你的情况的问题是使用固定LEFT JOIN

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