社会-双向友谊关系
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
。请使用示例数据和您想要的结果修改您的问题。
是的。你是对的,这个答案对于这个问题是正确的。我真正想要的是找到朋友的朋友,接受双向友谊。很抱歉。
你能帮我找朋友的朋友吗?以上是关于社会-双向友谊关系的主要内容,如果未能解决你的问题,请参考以下文章