社会-双向友谊关系

Posted

技术标签:

【中文标题】社会-双向友谊关系【英文标题】:Social - two-way friendship relation 【发布时间】:2013-11-25 12:08:52 【问题描述】:

我有两个简单的 mysql 表:用户和关系。

关系表:

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-server 友好的?)获得朋友的方式,但只有那些接受友谊的人(关系表中的两条记录:

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

【问题讨论】:

我认为不需要重新加入关系表。 你在你的问题中间有评论,我试图理解。你想要一个给定用户的朋友列表,其中友谊被认为是双向的吗? 是的。确切地。这就是我要找的。​​span> 用示例数据加载 SQLFiddle.com,让我们知道哪些记录应该返回,哪些记录不应该返回。 【参考方案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;

【讨论】:

不,因为有可能我没有加他为好友。因此,仅选择“交换”字段将不起作用。 我需要从 users 表中获取更多“朋友”数据,这就是我使用 LEFT JOIN 的原因 “我没有加他为好友”——那么双向关系是什么意思呢?该 JOIN ON 子句与您的示例不匹配吗? user_id:1 + friend_id:2 and user_id:2 + friend_id:1。请使用示例数据和您想要的结果修改您的问题。 是的。你是对的,这个答案对于这个问题是正确的。我真正想要的是找到朋友的朋友,接受双向友谊。很抱歉。 你能帮我找朋友的朋友吗?

以上是关于社会-双向友谊关系的主要内容,如果未能解决你的问题,请参考以下文章

企微SCRM是啥?

一场饭局,就能看透一个人(经典)

社会网络计算与社会网络分析核心指标有哪些?社会网络计算有什么意义?

社会关系网络网怎么绘制

社会工程学简述

2018成人高考政治