【问题标题】:Postgresql Multiple Left JoinsPostgresql 多个左连接
【发布时间】:2018-07-11 09:35:55
【问题描述】:

我正在尝试从表中获取列表并在两列上进行连接。我认为如果我向您展示我正在尝试做的事情会更好,并且希望它会有意义。

用户表:

username |  emailaddress  |                            socialkey                             |                                                       avatarpic                                
----------+----------------+------------------------------------------------------------------+------------------------------------------------------------------------------------------------
 Bobert   | bob@none.com   | 9784e946c53d44c975ee91625486d758fe630f176d44863080ec689ae3cd536a | https://craftedin.co/static/images/user/avatars/thumbs/59159be40a8c76.26091804.jpg
 Mikey    | mike@none.com  | 3bcd6c5f811ba06aa49c2df9504fe5416f35702b78bcdc15ecbd5137fabdca59 | http://cdn1-www.cattime.com/assets/uploads/gallery/siamese-cats-and-kittens-pictures/siamese-ca
 Mary     | mary@none.com  | f96197d19984b6f4a457ff0aed1c5bd222ffc2db51f30e4e8170ae02cb007ded | http://foopic.com
 Katya    | katya@none.com | 11ba72d57246c08ccbb9e201fb242a3f578d698e7d787d4a1aa08c8897b6cd80 | http://foopic.com

好友表:

    usera     |     userb      
---------------+----------------
 mike@none.com | bob@none.com
 mary@none.com | bob@none.com
 bob@none.com  | katya@none.com

我的查询获取用户 socialkey 并进行查找。不幸的是,这给了我不好的结果。我想使用用户 socialkey

with Sfriends as (
   select * 
   from friends 
   where usera = (select emailaddress 
                  from users 
                  where socialkey = '9784e946c53d44c975ee91625486d758fe630f176d44863080ec689ae3cd536a')) 
     or (userb = (select emailaddress 
                  from users 
                  where socialkey = ('9784e946c53d44c975ee91625486d758fe630f176d44863080ec689ae3cd536a')))
), socialkeys as (
  select socialkey,username,emailaddress,avatarpic 
  from users
) 
select Sfriends.usera, socialkey , avatarpic, Sfriends.userb,socialkey 
from Sfriends as foo 
   left join Socialkeys on foo.usera = socialkeys.emailaddress 
   left join Sfriends on foo.userb = socialkeys.emailaddress;

这是我想要的:

user-namea |     usera     |                          userasocialkey                          | usera-avatar-pic | user-nameb |     userb      |                          userbsocialkey                          |     userb-avatar-pic     
----------+---------------+------------------------------------------------------------------+------------------+----------+----------------+------------------------------------------------------------------+------------------
 Mikey    | mike@none.com | 3bcd6c5f811ba06aa49c2df9504fe5416f35702b78bcdc15ecbd5137fabdca59 | usera-avatar-pic | Bobert    | bob@none.com   | 9784e946c53d44c975ee91625486d758fe630f176d44863080ec689ae3cd536a | userb-avatar-pic
 Mary     | mary@none.com | f96197d19984b6f4a457ff0aed1c5bd222ffc2db51f30e4e8170ae02cb007ded | usera-avatar-pic | bobert    | bob@none.com   | 9784e946c53d44c975ee91625486d758fe630f176d44863080ec689ae3cd536a | userb-avatar-pic
 Bobert   | bob@none.com  | 9784e946c53d44c975ee91625486d758fe630f176d44863080ec689ae3cd536a | usera-avatar-pic | Katya     | katya@none.com | 11ba72d57246c08ccbb9e201fb242a3f578d698e7d787d4a1aa08c8897b6cd80 | userb-avatar-pic

如果有帮助的话,我愿意将社交密钥插入到朋友表中。

【问题讨论】:

  • 无关,但是:CTE socialkeys 没用。可以在最终select中直接加入users
  • 我很难理解,您的问题是“对于用户中的每个用户,加入他们的朋友”吗?他们的重复数据是否在朋友中?意思是 A B 和 B A?
  • 对于每个 usera ,朋友中的 userb 加入 users.socialkey 和头像。所以我需要 usera 和 userb 显示他的社交密钥和他的对应图片
  • 如果Friends中的每一对朋友可以像mike@none.com一样出现两次 | bob@none.com 和 bob@none.com | mike@none.com 那么您当然可以从用户电子邮件地址简单地加入好友的用户 B,然后选择好友用户 A 和用户的用户名列。这样做会列出所有用户名及其关联的朋友,并保留社交密钥

标签: sql postgresql join left-join


【解决方案1】:

尝试加入users 两次,一次加入usera,一次加入userb 来自friends

SELECT ua.username,
       ua.emailaddress,
       ua.socialkey,
       ua.avatarpic,
       ub.username,
       ub.emailaddress,
       ub.socialkey,
       ub.avatarpic
       FROM friends f
            INNER JOIN users ua
                       ON ua.emailaddress = f.usera
            INNER JOIN users ub
                       ON ub.emailaddress = f.userb
       WHERE '9784e946c53d44c975ee91625486d758fe630f176d44863080ec689ae3cd536a' IN (ua.socialkey,
                                                                                    ub.socialkey);

【讨论】:

  • 这与我之前尝试做的类似,但以 Sfriends 的身份加入。我遇到的问题是两次引用 Sfriends 的错误,我确信我不需要为同一件事制作两个 CTE。无论如何,这行得通!谢谢!
猜你喜欢
  • 2018-12-06
  • 2023-03-11
  • 1970-01-01
  • 2010-12-31
  • 2021-10-21
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多