我正在开发一个网站,当一个人将另一个人添加为朋友时,会创建两个条目。假设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
之间吸引共同朋友的方法有哪些?我正在使用没有PDO经验的php和MySQL(暂时)。
[编辑] 好的,所以我决定组织/规范化表格。该关系现在只生成1行。这使得表:
activity_id uid1 uid2
1 1 2
2 2 3
答案 0 :(得分: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
难道你不认为制作2行可能有点冒昧吗?也许uid 2真的不喜欢uid 1? (OTY)。
答案 1 :(得分:3)
查看other question中的表格格式,这应该是您想要的;
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;
演示here。
答案 2 :(得分:2)
查找uid 1
和uid 2
的所有常见朋友:
SELECT t1.uid2
FROM tbl t1
JOIN tbl t2 USING (uid2)
WHERE t1.uid1 = 1
AND t2.uid1 = 2;
但是有一个特例:此查询不显示1
&amp; 2
是朋友!
基本上这是关系划分的另一个案例。有很多不同的方法来抚育这只猫。 Find quite under this related question - 包括性能测试和更多信息。
现在每个友谊只有一行 - 用户可以在任一栏中弹出:
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)
答案 3 :(得分:0)
$query="SELECT distinct(uid2) FROM `test` where uid1=$uid union select distinct(uid1) from test where uid2=$uid";