Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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 在(1,2)(2,1)友谊场景中,有哪些方法可以获得共同的朋友?_Php_Mysql_Relational Division - Fatal编程技术网

Php 在(1,2)(2,1)友谊场景中,有哪些方法可以获得共同的朋友?

Php 在(1,2)(2,1)友谊场景中,有哪些方法可以获得共同的朋友?,php,mysql,relational-division,Php,Mysql,Relational Division,我正在开发一个网站,当一个人添加另一个人作为朋友时,会创建两个条目。让我们假设uid1添加uid2作为朋友,以下行是在MySQL中创建的 activity_id uid1 uid2 1 1 2 2 2 1 uid2与uid3成为朋友: activity_id uid1 uid2 1 1 2 2 2 1 3 2 3

我正在开发一个网站,当一个人添加另一个人作为朋友时,会创建两个条目。让我们假设
uid1
添加
uid2
作为朋友,以下行是在MySQL中创建的

activity_id   uid1 uid2
     1         1     2
     2         2     1
uid2
uid3
成为朋友:

activity_id   uid1 uid2
     1         1     2
     2         2     1
     3         2     3
     4         3     2
uid1
uid2
之间有什么方法可以获得共同的朋友?我使用的是php和MySQL,没有PDO经验(目前)

[编辑] 好的,所以我决定组织/规范这些表。该关系现在只生成一行。这就构成了表格:

activity_id   uid1 uid2
     1         1     2
     2         2     3

假设你称你的桌子为“朋友”

此查询将查找用户1和3的普通朋友

SELECT a.uid2
  FROM friends a
    INNER JOIN friends b
       ON a.uid2 = b.uid2
  WHERE a.uid1 = 1
   AND b.uid1 = 3

你不觉得排两行可能有点冒昧吗?也许uid 2不太喜欢uid 1?(OTY)。

查找
uid1
uid2
的所有普通朋友:

SELECT t1.uid2
FROM   tbl t1
JOIN   tbl t2 USING (uid2)
WHERE  t1.uid1 = 1
AND    t2.uid1 = 2;
但有一个特殊情况:此查询不显示
1
2
是否是朋友

顺便说一句,你的设计似乎有点多余。它应该与每个友谊只有一个条目。(不过,这个查询必须对此进行调整。)

基本上,这是关系划分的另一种情况。给这只猫剥皮有很多不同的方法包括性能测试和更多信息


查询更新的问题 现在每个友谊只有一行-用户可以在任一列中弹出:

SELECT uid
FROM (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 1
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 1
    ) u1
JOIN (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 2
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 2
    ) u2 USING (uid)

从你的表格格式来看,这应该是你想要的

SELECT name FROM users u
JOIN friends f1
  ON u.uid = f1.uid OR u.uid = f1.fid
JOIN friends f2
  ON u.uid = f2.uid OR u.uid = f2.fid
WHERE (f1.uid=1 OR f1.fid=1) AND (f2.uid=3 OR f2.fid=3) 
  AND u.uid<>1 AND u.uid<>3;
从用户u中选择名称
加入朋友f1
在u.uid=f1.uid或u.uid=f1.fid上
加入朋友f2
在u.uid=f2.uid或u.uid=f2.fid上
其中(f1.uid=1或f1.fid=1)和(f2.uid=3或f2.fid=3)
以及u.uid1和u.uid3;

演示。

感谢您的关注,我实际上有另一个专栏,说明他们是否都接受了友谊。因此,我最终规范化了表格,现在每个关系只生成一行。这次我该如何处理查询(见上面的编辑)?我想Erwin Brandstetter已经涵盖了它。我改变了处理关系的方式。它现在只生成一行数据。我应该调整哪一个查询?谢谢。@MikeSanchez:我为你的新情况添加了一个新版本。谢谢。然而,我确实遇到了新情况的问题。请看@MikeSanchez:Yup——不过,类似的问题。
SELECT name FROM users u
JOIN friends f1
  ON u.uid = f1.uid OR u.uid = f1.fid
JOIN friends f2
  ON u.uid = f2.uid OR u.uid = f2.fid
WHERE (f1.uid=1 OR f1.fid=1) AND (f2.uid=3 OR f2.fid=3) 
  AND u.uid<>1 AND u.uid<>3;