社交 - 双向友谊关系

时间:2013-11-25 12:08:52

标签: php mysql social-networking relationship

我有两个简单的MySQL表:user&关系。

关系表:

user_id int(10) unsigned    NO  PRI     
friend_id   int(10) unsigned    NO  PRI 

(部分)用户表:

id  int(10) unsigned    NO  PRI     
username    varchar(128)    NO

我使用此查询选择朋友的朋友:

SELECT f2.friend_id, u.username
FROM relations f1
JOIN relations f2 ON f1.friend_id=f2.user_id
LEFT JOIN user u ON u.id = f2.friend_id
WHERE f2.friend_id NOT IN (select friend_id from relations where user_id=@user_id) AND f1.user_id= 2 AND f2.friend_id!= 2

以上查询对于单向关系是可以的(我认为),我的“朋友”不必接受友谊。我知道它可以在某些情况下起作用,但我想,对我来说它应该是双向的。 我知道,“IN”声明的效率不高。什么是最好的(最快的?最友好的mysql服务器?)获得朋友的方式,但只有那些已经接受友谊的人(关系表中的两条记录:

user_id:1 + friend_id:2 and user_id:2 + friend_id:1)?

1 个答案:

答案 0 :(得分:1)

您确定需要LEFT JOIN到用户表吗?这不是一个需要记录存在的外键吗?对于双向关系,您不只是在关系表中查找用户和朋友字段被“交换”的记录吗?

SELECT f2.friend_id, u.username
FROM relations f1
JOIN relations f2 
  ON f1.friend_id = f2.user_id
    AND f1.user = f2.friend_id
LEFT JOIN user u
  ON u.id = f1.friend_id
WHERE f1.user_id @user_id;