【发布时间】:2017-10-04 13:18:41
【问题描述】:
我正在使用 PostgreSQL 克隆 Twitter。用户可以写帖子,他们可以分享它们。每个用户都有一个时间表,其中显示了他关注的人的帖子和分享。我还必须展示共享帖子(转推)和原作者的普通帖子之间的区别。加入表格时遇到以下问题:
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
【问题讨论】:
-
发布您正在使用的查询
标签: sql postgresql join