2011-12-20 51 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