2011-10-19 120 views
0

我正在研究“可能的朋友”功能。在这里我需要显示各界朋友的朋友谁是不是我的朋友,也没有给我或者没有我的挂起的请求Sql获取不是我的朋友的朋友的所有朋友

FRIENDSHIPS 
user_id 
friend_id 
status (0 = pending, 1 = approved) 

对于各好友我做两个记录。说用户1和2成为朋友...我会在friendships表中创建一个记录where user_id=1,friend_id=2和另一个where user_id=2, friend_id=1

当第一用户发送请求时,将状态设置为0,当好友接受请求的话,我会用1

我将如何做一个SQL查询,建议“可能朋友”的基础上的我的朋友的朋友更新都行?

回答

7

在这里你去......简单连接

SELECT F2.friend_id 
FROM FRIENDSHIPS F 
JOIN FRIENDSHIPS F2 ON F.friend_id = F2.user_id 
WHERE F2.friend_id NOT IN (SELECT friend_ID FROM FRIENDSHIPS WHERE user_id = @user_id) 
    AND F.user_id = @user_id 
+0

感谢它正常工作对我! –

+0

它太慢了吗? –

0

我想你也可以使用一个子查询(?)来获取同样的信息。

SELECT friend_id FROM友谊 其中USER_ID IN (SELECT friend_ID从友谊其中USER_ID = @ YOURUSER_ID和状态= 1) 和friend_id <> @YOURUSER_ID

SELECT friend_id 
FROM FRIENDSHIPS 
WHERE user_id IN 
(SELECT friend_ID FROM FRIENDSHIPS WHERE [email protected]_ID AND status=1) 
AND friend_id NOT IN 
(SELECT friend_ID FROM FRIENDSHIPS WHERE [email protected]_ID AND status=1) 
AND friend_id<>@YOURUSER_ID 

我想工作,但连接方法要简单得多。

+0

我不同意。它的两个疑问。第一个带回YOURUSER_ID所有认可朋友的列表。第二个选择返回所有friend_id,其中user_id位于由第一个查询生成的列表中,除非friend_id等于YOURUSER_ID。 – vice

+0

是的,你是对的,第一个列表中的所有朋友第二列出他们所有的朋友,但它不排除你的朋友,只是你被列为他们的朋友的情况。例如,如果我是A和B的朋友,B是A的朋友,那么这个查询将列出A. – Hogan

+0

很对,我的错误 – vice

0

试试这个:-)

select * from FRIENDSHIPS pf 
JOIN FRIENDSHIPS f ON pf.friend_id=f.user_id AND pf.status=1 AND f.status=1 
JOIN FRIENDSHIPS me ON me.user_id = f.friend_id AND me.user_id = MY_USER_ID AND me.status=1 AND f.status=1 
WHERE me.user_id <> pf.friend_id AND me.friend_id <> pf.user_id 
-1

请试试这个 - > :)

SELECT f2.friend_id
FROM FRIENDSHIPS f1
JOIN FRIENDSHIPS f2
ON f1.friend_id=f2.user_id
WHERE f2.friend_id NOT IN (select friend_id from FRIENDSHIPS where [email protected]_id)
AND [email protected]_id
AND [email protected]_id

+1

请注意3个upvotes和它左边的绿色检查的答案?这意味着,这个答案已经解决了这个问题。 – fancyPants

+0

@fancyPants - 也是这个答案是错误的。最后的where子句是不需要的。 – Hogan