【发布时间】:2022-01-26 00:07:56
【问题描述】:
我有 2 张不同的桌子;第一个是“用户”,第二个是“关系”。
Users 有 'username' 列,Relations 有 'username' 和 'friendsname'。 对于每个友谊实例,都会在该表中插入 2 行。例如,如果 John 将 Janna 添加为朋友,这意味着 John 也被 Janna 添加了。
我正在尝试在 Facebook 或 Twitter 中查找朋友建议之类的内容。 随机用户将从 Users 表中选择,并将在 Relations 表中检查他们是否为朋友。这将持续进行,直到找到 5 个成功的非好友匹配并一次全部返回(如果可能)。
我可以自己选择所有行并在服务器中迭代/搜索,但我不认为这是 PostgreSQL 无法处理的事情。对于这个级别“相对”微不足道的功能,我的方式似乎过于昂贵。
有什么简单优雅的方式来处理这个任务吗?
提前致谢,祝您周日/圣诞夜愉快。
更新: 我正在附加一些模拟数据,抱歉耽搁了:
create table relations (
rel_id bigserial primary key not null ,
username VARCHAR(50) not null ,
friendname VARCHAR(50) not null ,
since DATE not null
);
insert into relations (rel_id, username, friendname, since) values (1,'user1', 'user2', '06/01/2021');
insert into relations (rel_id, username, friendname, since) values (2,'user2', 'user1', '06/01/2021');
insert into relations (rel_id, username, friendname, since) values (3,'user1', 'user3', '16/10/2021');
insert into relations (rel_id, username, friendname, since) values (4,'user3', 'user1', '16/10/2021');
insert into relations (rel_id, username, friendname, since) values (5,'user3', 'user5', '16/01/2020');
insert into relations (rel_id, username, friendname, since) values (6,'user5', 'user3', '16/01/2020');
create table Users (
user_id bigserial primary key not null ,
username VARCHAR(50) not null
);
insert into Users (user_id, username) values (1,'user1');
insert into Users (user_id, username) values (2,'user2');
insert into Users (user_id, username) values (3,'user3');
insert into Users (user_id, username) values (4,'user4');
insert into Users (user_id, username) values (5,'user5');
insert into Users (user_id, username) values (6,'user6');
insert into Users (user_id, username) values (7,'user7');
正如预期的结果查询可能会建议 User1 的 User4-5-6 和 7 作为朋友。因为根据表 user1 仅与用户 2 和 user3 是朋友。考虑到他不能和自己成为朋友,我们也不希望在结果中看到 user1。
【问题讨论】:
-
请贴出上述数据的预期结果。
-
我希望现在已经足够了。如有误解,请随时提醒。
标签: sql postgresql