sql查询朋友的朋友

时间:2011-01-10 03:54:07

标签: sql mysql

我知道如何在1个查询中获得mutal朋友,但现在来了困难的部分,我怎样才能让所有朋友朋友在1个查询中都不是我的朋友,它返回用户ID?我已经看了一些关于这个的帖子,但我无法按照我的意愿让它们工作。

我的关系是两种方式,所以如果1和2是朋友,则关系表中存在两行。

我的表格及相关信息:

table_users
user_id

table_relations
rel_id
from_id
to_id

我现在已经用了2天了,我似乎无法让它发挥作用。

最好的问候, 亚历山大

3 个答案:

答案 0 :(得分:3)

# Friends
SELECT to_id
  FROM table_relations
 WHERE from_id=ME;

# Friends of Friends
SELECT to_id
  FROM table_relations
 WHERE from_id IN (
       SELECT to_id
         FROM table_relations
        WHERE from_id=ME
       );

# Friends of Friends, not my friends
SELECT to_id
  FROM table_relations
 WHERE from_id IN (
         SELECT to_id
           FROM table_relations
          WHERE from_id=ME
       )
       AND
       to_id NOT IN (
         SELECT to_id
           FROM table_relations
          WHERE from_id=ME
       );

我确信有一种方法可以使临时表更有效率,但这应该可以帮助你。

答案 1 :(得分:1)

假设您有id 1

/*Your friends' friends*/
SELECT r2.from_id FROM
table_relations r
INNER JOIN table_relations r2
ON r.from_id = r2.to_id
WHERE r.to_id = 1
EXCEPT /*EXCEPT is Standard but MINUS in Oracle*/
/*Your friends*/
SELECT from_id
FROM table_relations
WHERE to_id = 1

或使用OUTER JOIN

SELECT DISTINCT r2.from_id
FROM
table_relations r
INNER JOIN table_relations r2
ON r.from_id = r2.to_id
LEFT OUTER JOIN table_relations r3 ON r3.to_id = r2.from_id AND r3.from_id=1
WHERE r.to_id = 1 AND r3.from_id is null

答案 2 :(得分:0)

找到你所有的朋友,找到所有朋友的朋友。然后,使用NOT IN查找差异。

select user_id
from
(
   select user_id from ... --select all the friends friends
) as friends_friends

where friends_friends.user_id not in
(
   select from_id from  
     from table_relations
     where MYID=to_id 
)