2017-10-04 129 views
0

我正在使用PostgreSQL對Twitter進行克隆。用戶可以撰寫帖子,並可以分享。每個用戶都有一個時間表,它顯示了他所關注人員的帖子和份額。我還必須顯示原作者的共享帖子(轉推)和常規帖子之間的區別。我在參加該表時,以下問題:SQL連接添加空行值的行

Post                
post_id | user_id | text           
1   1   text           

Shares               
post_id | user_id            
1   2              

Join_result              
Post.post_id | Post.user_id | Post.text | Shares.post_id | Shares.user_id               
1    1    text  1    2  

然後,我通過Post.user_idShares.user_id過濾。但是,有了這個結果,我不知道我是否顯示帖子,因爲它是user 2共享或user 1帖子。一個好的解決方案對我來說,這將是該聯接表:

Join_result              
Post.post_id | Post.user_id | Post.text | Shares.post_id | Shares.user_id               
1    1    text  null    null 
1    1    text  1    2 

現在我能正確篩選:

(Post.user_id in following and Share.user_id is NULL) or Share.user_id in followings 

在這個例子中,如果用戶遵循user 1,它返回的第一行;如果他遵循user 2我得到第二個,如果他跟隨兩個用戶,返回兩行。

我已經使用UNION查詢解決了這個問題,但我想知道是否有另一個解決方案(和更好)。

編輯查詢:

SELECT p0* f1.*, FROM "posts" AS p0 
LEFT OUTER JOIN "forwards" AS f1 ON f1."post_id" = p0."id" 
INNER JOIN (SELECT id FROM users AS u0 
      INNER JOIN follows AS f1 ON (f1.follower_id = $1) AND (f1.following_id = u0.id) UNION 
      SELECT id FROM users AS u1 WHERE (u1.id = $1) 
) AS f3 ON (p0."author_id" = f3."id") OR (f1."user_id" = f3."id") ORDER BY p0."inserted_at" DESC 
+0

後您使用 – dbajtr

回答

0

您正在使用LEFT OUTER JOIN,在這種情況下,如果沒有向前存在,它會在結果集空值。

看到這個職位的詳細資料: What is the difference between "INNER JOIN" and "OUTER JOIN"?

+0

我知道這個查詢,謝謝。問題是,如果一個帖子有一個共享(forward,retweet),那麼連接表將總是設置'share.user_id'。它並不關心用戶是否真正關注轉發器。 –