0

私は2つのテーブルを持っています:

おすすめの友達と追加した友達

各テーブルには、User フィールドと Friend フィールドがあります。ユーザーが何人の友達を追加したかを確認する方法を理解しようとしています。テーブルの例を次に示します。

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 に答える