我正在使用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_id
或Shares.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
後您使用 – dbajtr