0

我有两张桌子:

推荐的朋友和添加的朋友

每个表都有一个用户字段和一个朋友字段。我试图弄清楚如何才能看到用户添加了多少朋友,他们也被推荐了。下面是表格的示例:

RecommendedFriends
User    Friends     Time
------------------------------------
Jake    Eric        8:00am
Jake    John        8:00am
Jake    Jack        8:30am
Greg    John        8:30am
Greg    Tim         9:00am
Greg    Steve       9:30am
Will    Jackson     9:30am

AddedFriends
User    Friends     Time
------------------------------------
Jake    Jack        8:35am
Greg    John        8:35am
Greg    Tim         9:00pm
Greg    Jim         10:30am
Greg    Tina        10:45am
Greg    Bob         10:00am
Charlie Brian       11:00am

所以我需要的表看起来像这样:

Results
User    RecFriends  AddFriends   
------------------------------------
Jake    Eric        
Jake    John        
Jake    Jack        Jack
Greg    John        John
Greg    Tim         Tim
Greg    Steve       
Greg                Tina
Will    Jackson     
Charlie             Brian

所以我可以进去说 3 人添加了他们被推荐的朋友,4 人推荐失败,2 人添加了他们未被推荐的人。

4

1 回答 1

2

我想你想要的是full outer join

select coalesce(rf.USER, af.user) as user, rf.friends as RecFriends, af.Friends as AddFriends,
from RecommendedFriends rf full outer join
     AddedFriends af
     on rf.user = af.user and
        rf.Friends = af.Friends

这不考虑时间。如果您想推断推荐和添加之间的因果关系,您可能需要检查添加的时间是否在推荐的时间之后。

如果您使用的数据库不支持full outer join(任何人都可以说“MySQL”),您可以获得相同的结果:

select t.user, MAX(case when which = 'rec' then friends end) as RecFriends,
       MAX(case when which = 'add' then friends end) as AddFriends
from ((select rf.user, rf.friends, 'rec' as which
       from RecommendedFriends af.user
      ) union all
      (select af.user, af.friends, 'add' as which
       from AddedFriends af
      )
     ) t
group by user

这个版本有一个很好的特性,它不会产生重复的记录,在多个推荐或添加的情况下。

于 2013-02-08T15:15:47.773 回答