2014-02-22 100 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