在阅读有关此内容的文章后,我打算在MySQL数据库中双向存储友谊。

A-> B
B-> A

如果友谊仅以一种方式存储,则意味着友谊尚未得到确认,删除或任何其他形式。

我现在唯一想知道的是如何查询此信息?

如果我要查询所有用户的朋友。我如何仅获得已确认的友谊?以后我是否可以通过遍历数组来整理未确认的友谊,或者是否可以使用此查询?

还有,这对逆如何起作用?对仅获得未经确认的友谊有什么疑问?

编辑

使用Laravel进行查询,可以在模型中进行查询:

$friendsCollection = $this->where('user_a', '=', $currentUserId)->orWhere('user_b', '=', $currentUserId)->get();


这将给我所有的行,其中当前用户是友谊中的user_a或user_b。

现在我的问题是如何清除“断开”的连接?两行中只有其中一行存在?

我刚想到的是,当用户开始有很多朋友时如何对它进行分页。

最佳答案

您的表如下所示:

CREATE TABLE users(
    userId int  PRIMARY KEY,
    username VARCHAR(30) NOT NULL
);

CREATE TABLE friendship(
    userId int NOT NULL,
    friendId int NOT NULL,
    PRIMARY KEY (userId, friendId)
);


插入一些值:

insert into users VALUES (1, 'a');
insert into users VALUES (2, 'b');
insert into users VALUES (3, 'c');

insert into friendship VALUES (1,2);
insert into friendship VALUES (2,1);
insert into friendship VALUES (1,3);


因此,用于查找双向友谊的查询如下所示:

SELECT u1.username, u2.username
FROM friendship f1
LEFT JOIN users u1
  ON u1.userId = f1.userId
LEFT JOIN users u2
  ON u2.userId = f1.friendId
  WHERE EXISTS (SELECT * FROM friendship f2 WHERE f2.userId = f1.friendId)


结果:

username username
------------------
  a         b
  b         a


对于单向(未经确认)友谊的查询如下所示:

SELECT u1.username, u2.username
FROM friendship f1
LEFT JOIN users u1
  ON u1.userId = f1.userId
LEFT JOIN users u2
  ON u2.userId = f1.friendId
  WHERE NOT EXISTS (SELECT * FROM friendship f2 WHERE f2.userId = f1.friendId)


结果:

username username
------------------
  a         c

10-08 17:18