【问题标题】:SQL JOIN two tables and return corresponding likeSQL JOIN 两个表并返回对应的like
【发布时间】:2021-05-25 09:18:41
【问题描述】:

这是我的第一篇文章。在玩了几年之后,到目前为止,我已经能够找到问题的解决方案,但我最终陷入困境,主要是因为我认为我的措辞和词汇是错误的,但我跑题了。

我有两张桌子让我们说推文和喜欢..

喜欢

Liker | like_id | tweet_id

C |       2 |      | 27
  C |       3 |      | 1
  C |       4 |      | 2
  C |       6 |      |  22
  D |       7 |      | 3
  D |       8 |      | 27
  D |       9 |      | 22

推文

Tweeter | Tweet_id | 
    A |       1 |    
       A|       2 |      
      A |       3 |      
      B |       4 |      
      B |       22|      
      B |       23|      
      B |       24|  

当我查看用户页面时,我想查看他们所有的推文,如果我喜欢其中任何一个,我会很高兴看到这个,所以竖起大拇指或其他什么。

所以如果我用户 C 查看用户 B 的提要,当我加入表格时它应该会显示以下内容

Tweets for user A    

Tweeter | Tweet_id | liked_by_me      
      B |       4 |      
      B |       22 |      YES
      B |       23 |      
      B |       24 |  

我以为我能弄明白,但当推文的点赞数超过我的点赞数时,问题就很明显了。这就是我累了

SELECT * FROM tweets LEFT OUTER JOIN likes ON (tweets.tweet_id = likes.p_id) WHERE tweets.user= B AND (likes.likedby is NULL or likes.likedby= C)

但如果其他人喜欢 C 以外的推文,则完整列表不会回来......

提前致谢

【问题讨论】:

    标签: sql database postgresql join


    【解决方案1】:

    进行外部联接时,将约束条件 (likedby = 'C') 放在联接的 on 内。如果您在where 中应用该条件,则将从结果集中删除该行。

    SELECT tweets.tweeter, tweets.tweet_id, 
           case 
             when likes.like_id is not null then 'YES'
           end as liked_by_me
      FROM tweets 
           LEFT JOIN likes 
             ON likes.p_id = tweets.tweet_id
            AND tweets.user = 'B'
            AND likes.likedby = 'C';
    
    

    【讨论】:

    • 谢谢,当有人向您展示时,它总是一个简单的解决方案
    【解决方案2】:

    使用LEFT JOIN 时,first 表上的条件位于WHERE 子句中。 second (以及链中的后续表)上的条件进入ON 子句。所以你似乎想要:

    SELECT t.tweeter, t.tweet_id, 
           (case when l.like_id is not null then 'YES'
            end) as liked_by_me
    FROM tweets t LEFT JOIN
         likes l
         ON l.p_id = t.tweet_id AND
            l.likedby = 'C'
    WHERE t.user = 'B';
    

    原因很简单。无论ON 子句的结果如何,LEFT JOIN 都会将所有行保留在 first 表中。然后包含来自第二个表的匹配列,具有NULL 值,除非ON 评估为true

    这些列上的WHERE 条件通常会过滤掉不匹配的行。

    请注意,我还添加了表别名,以便查询更易于编写和阅读。

    【讨论】:

    • 感谢您的解释,我一直在查找条件连接,但想出了一个完全不同的主题,这很有效。
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多