2011-12-20 49 views
0

我可以使用幫助,下面的查詢這是建議的朋友給用戶創建友好的建議查詢跨越3種型號

我有三個型號:

User (id, fb_id, org_id) 
FbFriends (user_id, fb_id, org_id) 
Friendships (user_id, friend_id) 

FbFriends是緩存用戶的朋友在臉書上。友誼是我的應用程序的友誼。

目標,返回基於以下條件的用戶:

  1. 排序由用戶org_id
  2. 過濾掉任何人,如果他們已經在兩個用戶之間的友誼紀錄。

是否有可能根據上面的一個查詢返回@users?或者我需要用多個查詢來構建它?

感謝

+0

添加樣本輸出會有所幫助,我不認爲查詢本身是困難,但我不是100%確定你在找什麼。它只是一個org_id,user_id,<潛在新朋友>的列表嗎? – Sparky 2011-12-20 21:58:08

+0

我正在查找用戶的輸出。基於上述條件的用戶表中的用戶列表。明白了嗎? – 2011-12-20 21:59:26

+1

您是否希望在FBfriends或Friendship中查看用戶表中沒有「朋友」的用戶?或者你想看看每個用戶,可能的朋友列表(其他用戶,他們不是已經與朋友?) – Sparky 2011-12-20 22:25:07

回答

1

在SQL你會做這樣的:

SELECT * FROM users 
JOIN friendships friendships_l ON users.id = friendships.user_id 
JOIN friendships friendships_r ON users.id = friendships.friend_id 
WHERE {{some_user_id}} <> users.id 
    AND {{some_user_id}} <> friendships_l.friend_id, 
    AND {{some_user_id}} <> friendships_r.user_id 
ORDER BY users.org_id 

在ActiveRecord的:

User. 
    joins('JOIN friendships friendships_l ON users.id = friendships_l.user_id'). 
    joins('JOIN friendships friendships_r ON users.id = friendships_r.friend_id'). 
    where(%[ :uid <> users.id AND 
      :uid <> friendships_l.friend_id AND 
      :uid <> friendships_r.user_id 
     ], 
     { :uid => some_user.id } 
). 
    order('users.org_id').all 
+0

謝謝,但這似乎沒有考慮到FbFriends或org_id? – 2011-12-20 22:15:55

+0

此外,得到一個錯誤「PGError:錯誤:表的無效參考FROM子句條目」友誼「 線1:... ers」加入友誼friendships_l ON users.id =友誼... ^ 提示:也許你打算引用表別名「friendships_l」。 「 – 2011-12-20 22:16:51

+0

糟糕,我的壞。修正。 – 2011-12-20 22:20:28