Php 确定两个用户是否通过朋友的朋友连接
因此,有一个友谊请求表:Php 确定两个用户是否通过朋友的朋友连接,php,mysql,sql,algorithm,Php,Mysql,Sql,Algorithm,因此,有一个友谊请求表: +--------+----------+ | sender | receiver | +--------+----------+ | 1 | 2 | | 2 | 1 | +--------+----------+ 如果两个用户都向对方发送了请求,则两个用户是朋友 我使用PHP的array_intersect与包含每个用户的所有好友的数组进行交互,以确定它们是否通过好友的好友进行连接 i、 e 123 如果两个用户有朋
+--------+----------+
| sender | receiver |
+--------+----------+
| 1 | 2 |
| 2 | 1 |
+--------+----------+
如果两个用户都向对方发送了请求,则两个用户是朋友
我使用PHP的array_intersect与包含每个用户的所有好友的数组进行交互,以确定它们是否通过好友的好友进行连接
i、 e
123
如果两个用户有朋友,而他们的朋友又是彼此的朋友,那么最有效的方法是什么。
i、 e.
+--------+----------+
| sender | receiver |
+--------+----------+
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
| 3 | 2 |
| 3 | 4 |
| 4 | 3 |
+--------+----------+
1 <--> 2 <--> 3 <--> 4
+--------+----------+
|发送方|接收方|
+--------+----------+
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
| 3 | 2 |
| 3 | 4 |
| 4 | 3 |
+--------+----------+
1 2 3 4
用户1应该知道他与用户4的关系
PS:使用PHP/伪代码或MySQL也可以
编辑:我不想创建其他表或视图。我希望使用上述资源获得最佳解决方案。我将创建一个图形结构。邻接列表表示法可以很好地工作。然后您可以运行深度优先搜索 首先创建检测友谊的视图:
CREATE VIEW friendship (friend1, friend2)
AS SELECT p1.id, p2.id from person as p1, person as p2
WHERE
(SELECT count(*) from friendship_request as fr1 WHERE
fr1.sender = p1.id AND fr1.receiver = p2.id) > 0
AND
(SELECT count(*) from friendship_request as fr2 WHERE
fr2.receiver = p1.id AND fr1.sender = p2.id) > 0
现在,查询第一级连接的操作非常简单
SELECT p1.name, p1st.name, p2.name
FROM person as p1, person as p2, person as p1st,
friendship as fs1, friendship as fs2
WHERE p1.id = fs1.friend1
AND p2.id = fs2.friend1
AND fs1.frind2 = fs2.frind2
AND fs2.frind2 = p1st.id
对于二级连接:
SELECT DISTINCT p1.name, p2nd1.name, p2nd2.name, p2.name
FROM person as p1, person as p2, person as p2nd1, person as p2nd2,
friendship as fs1, friendship as fs2, friendship as fs2nd
WHERE p1.id = fs1.friend1
AND p2.id = fs2.friend1
AND fs1.frind2 = fs2nd.frind2
AND fs2.frind2 = fs2nd.frinend2
AND p2nd1.id = fs1.frind2
AND p2nd2.id = fs2.frind2
等等
没有测试,但在任何正常的RDBMS中都应该工作:-)这可能是一个常见问题。Google重新关联/SQL数据/表/查询层次结构/树。请总是在你问谷歌stackoverflow之前,对你的问题做出许多简洁明了的陈述。(让其中一个成为你的头衔。)PS“高效”毫无意义。或者换句话说,你使用了它,你说它是什么意思,确切地说,我们不想告诉你。我不想要一个有节点的表…“节点”是一个通用术语,指的是一个东西有一个(可能是“定向的”)“边”到另一个东西/节点。即它们(节点)以某种方式(边缘)相关/关联。就像朋友(节点)已经成为朋友(定向边)一样,朋友(节点)。阅读更多。我告诉过你,这是一个常见问题。这是基本的。你正在寻找你的关系/关联的“传递性终结”(如表所示)。@FrenchMajesty这不是一个愚蠢的问题。(尽管它是常见问题解答和副本)。我不是一个混蛋。我给出了一些有用的事实、问题和行动。OP多次告诉我(在读了5分钟之后一次)我的评论不适用,没有要求解释,即使我告诉他们其他的,他们的问题是常见问题,一个规范的答案,他们应该如何教育自己,他们的问题是什么。
SELECT DISTINCT p1.name, p2nd1.name, p2nd2.name, p2.name
FROM person as p1, person as p2, person as p2nd1, person as p2nd2,
friendship as fs1, friendship as fs2, friendship as fs2nd
WHERE p1.id = fs1.friend1
AND p2.id = fs2.friend1
AND fs1.frind2 = fs2nd.frind2
AND fs2.frind2 = fs2nd.frinend2
AND p2nd1.id = fs1.frind2
AND p2nd2.id = fs2.frind2