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;