在 (1, 2) (2, 1) 友谊场景中可以通过哪些方式获得共同的朋友?
-
12-12-2019 - |
题
我正在开发一个网站,其中当一个人将另一个人添加为朋友时,会创建 2 个条目。比方说 uid 1
添加 uid 2
作为朋友,在 MySQL 中创建了以下行。
activity_id uid1 uid2
1 1 2
2 2 1
uid 2
成为朋友 uid 3
:
activity_id uid1 uid2
1 1 2
2 2 1
3 2 3
4 3 2
有哪些方法可以让彼此成为朋友 uid 1
和 uid 2
?我正在使用 php 和 MySQL,但没有 PDO 经验(目前)。
[编辑]好的,所以我决定组织/标准化表格。该关系现在仅生成 1 行。这使得表格:
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 ?(奥蒂)。
找到所有共同的朋友 uid 1
和 uid 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";
不隶属于 StackOverflow