在(1,2)(2,1)友谊场景中,有什么方法可以获得共同的朋友


What are ways to get mutual friends in a (1, 2) (2, 1) friendship scenario?

我正在开发一个网站,当一个人添加另一个人作为朋友时,会创建2个条目。假设uid 1uid 2添加为好友,则在MySQL中创建以下行。

activity_id   uid1 uid2
     1         1     2
     2         2     1

uid 2uid 3:成为好友

activity_id   uid1 uid2
     1         1     2
     2         2     1
     3         2     3
     4         3     2

uid 1uid 2之间有哪些方法可以获得共同的朋友?我使用php和MySQL,没有PDO经验(目前)。

[EDIT]好的,所以我决定整理/规范这些表格。该关系现在只生成1行。这张表就是

activity_id   uid1 uid2
     1         1     2
     2         2     3

从您的另一个问题中查看表格格式,这应该符合您的要求;

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;

在这里演示。

假设您称您的桌子为"朋友"。

此查询将查找用户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)。

查找uid 1uid 2的所有共同好友:

SELECT t1.uid2
FROM   tbl t1
JOIN   tbl t2 USING (uid2)
WHERE  t1.uid1 = 1
AND    t2.uid1 = 2;

不过,有一种特殊情况:此查询不显示1&2是朋友!

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

基本上,这是关系划分的另一种情况。有很多不同的方法可以剥这只猫的皮。在这个相关的问题下找到答案,包括性能测试和更多信息。


查询更新的问题

现在每个友谊只有1行——用户可以在任意一列中弹出:

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)
$query="SELECT distinct(uid2) FROM `test` where uid1=$uid union select distinct(uid1) from test where uid2=$uid";