在阅读有关此内容的文章后,我打算在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