Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确定两个用户是否通过朋友的朋友连接_Php_Mysql_Sql_Algorithm - Fatal编程技术网

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