我正在开发一个网站,其中当一个人将另一个人添加为朋友时,会创建 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 1uid 2?我正在使用 php 和 MySQL,但没有 PDO 经验(目前)。

[编辑]好的,所以我决定组织/标准化表格。该关系现在仅生成 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 ?(奥蒂)。

找到所有共同的朋友 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";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top