【问题标题】:SQL join adding rows with null valuesSQL join 添加具有空值的行
【发布时间】: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_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

【问题讨论】:

  • 发布您正在使用的查询

标签: sql postgresql join


【解决方案1】:

您正在使用 LEFT OUTER JOIN,在这种情况下,如果不存在转发,它将在结果中设置空值。

查看这篇文章了解更多信息: What is the difference between "INNER JOIN" and "OUTER JOIN"?

【讨论】:

  • 我知道了,谢谢。问题是,如果帖子有分享(转发、转发),那么连接表将始终设置share.user_id。它不关心用户是否真的关注转发者。
猜你喜欢
  • 2017-09-02
  • 2021-08-16
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多