2011-03-23 76 views
0

我有这个疑问:过滤掉加入

SELECT DISTINCT(b.friend_id) AS possible_id 
FROM friends_friends a 
    JOIN friends_friends b 
     ON b.user_id = a.friend_id 
WHERE a.user_id = 123456789 

本质上讲它是它通过获取用户的朋友的朋友

现在我想要做的就是过滤器获取可能的好友列表出该特定用户的朋友列表

这里有一个例子让用户朋友

SELECT friend_id 
FROM friends_friends 
WHERE user_id = 123456789 

我想用Join来实现这一点,我知道它很简单,但我似乎无法把它包裹起来。

+0

可能的重复[任何方式来加入这两个查询没有子查询?](http://stackoverflow.com/questions/5409582/any-way-to-join-these-two-queries-without -subquery) – 2011-03-23 22:15:12

+0

这不是重复的,而是不同的情况。 – ehftwelve 2011-03-23 22:18:02

回答

0
SELECT DISTINCT(b.friend_id) AS possible_id 
FROM friends_friends a 
    JOIN friends_friends b 
     ON b.user_id = a.friend_id 
    LEFT JOIN friends_friends c 
     ON c.user_id = a.user_id 
    AND b.family_id = c.friend_id 
WHERE a.user_id = 123456789 
AND c.friend_id IS NULL 

这为我工作:)

+0

你的表中有'family_id'吗? :o – nitro2k01 2011-03-23 22:35:54

+0

......忘了改变这一点。我改变它使其更具可读性。 – ehftwelve 2011-03-24 15:28:29

0

您可以在条款中添加不合你的where子句:

and b.friend_id NOT IN (SELECT friend_id 
FROM friends_friends 
WHERE user_id = 123456789) 
+0

虽然诱人,直观的声音,与'NOT IN'查询有时会产生不良的表现。 – nitro2k01 2011-03-23 22:20:56

0
SELECT DISTINCT(b.friend_id) AS possible_id 
FROM friends_friends a 
    JOIN friends_friends b 
     ON b.user_id = a.friend_id 
LEFT JOIN friends_friends n 
     ON b.user_id = n.friend_id AND n.user_id = 123456789 
WHERE a.user_id = 123456789 AND n.friend_id IS NULL 

我想我说对了......