Postgresql不包括已经存在的友谊关系
我有两张表:用户和友谊:Postgresql不包括已经存在的友谊关系,sql,postgresql,Sql,Postgresql,我有两张表:用户和友谊: CREATE TABLE t_users ( user_id varchar PRIMARY KEY, name varchar ); CREATE TABLE t_friendship ( friendship_id varchar PRIMARY KEY, from_user_id varchar, to_user_id varchar ); INSERT INTO t_users VALUES ('us123', 'us123'); INSERT INTO t
CREATE TABLE t_users (
user_id varchar PRIMARY KEY,
name varchar
);
CREATE TABLE t_friendship (
friendship_id varchar PRIMARY KEY,
from_user_id varchar,
to_user_id varchar
);
INSERT INTO t_users VALUES ('us123', 'us123');
INSERT INTO t_users VALUES ('us456', 'us456');
INSERT INTO t_users VALUES ('us789', 'us789');
INSERT INTO t_users VALUES ('us987', 'us987');
INSERT INTO t_users VALUES ('us654', 'us654');
INSERT INTO t_users VALUES ('us321', 'us321');
INSERT INTO t_friendship VALUES ('fr123', 'us123', 'us456');
INSERT INTO t_friendship VALUES ('fr456', 'us123', 'us789');
INSERT INTO t_friendship VALUES ('fr789', 'us123', 'us987');
INSERT INTO t_friendship VALUES ('fr987', 'us456', 'us123');
INSERT INTO t_friendship VALUES ('fr654', 'us456', 'us321');
INSERT INTO t_friendship VALUES ('fr321', 'us987', 'us123');
INSERT INTO t_friendship VALUES ('fr322', 'us456', 'us654');
INSERT INTO t_friendship VALUES ('fr323', 'us654', 'us123');
INSERT INTO t_friendship VALUES ('fr324', 'us789', 'us654');
INSERT INTO t_friendship VALUES ('fr325', 'us321', 'us123');
SELECT
t_users.user_id,
t_users.name
FROM t_friendship
inner join t_users on t_friendship.from_user_id = t_users.user_id
WHERE t_friendship.to_user_id = 'us123';
如何在排除已存在的友情关系(从\u user\u id->到\u user\u id)的同时,提出显示推荐好友的请求?例如,“us123”、“us456”
谢谢。对于您的特定结果,您可以使用:
select u.*
from t_users u
where not exists (select 1
from t_friendships f
where f.to_user_id = 'us123' and
f.from_user_id = u.user_id
) and
u.user_id <> 'us123';
此查询不会返回任何行,因为该用户与所有其他用户都有朋友(在某个方向)
请注意,如果您是从应用程序调用此函数,那么您应该使用参数,而不是将用户id填充到查询字符串中。当然可以。上一个示例返回一个空结果。第一个是它应该工作的。哪个选项更可取?@SergeyKozlov。我误解了数据。友谊是不对称的。我用你想要的结果修改了答案。@SergeyKozlov。不是第一个查询。结果取决于友谊关系是否是对称的,这也是答案其余部分试图解释的。非常感谢戈登。你的回答是真实的和鼓舞人心的。谢谢你安排的时间。
select u.*
from t_users u
where not exists (select 1
from t_friendships f
where f.to_user_id = 'us123' and
f.from_user_id = u.user_id
) and
u.user_id <> 'us123';
select u.*
from t_users u
where not exists (select 1
from t_friendships f
where f.to_user_id = 'us123' and
f.from_user_id = u.user_id
) and
not exists (select 1
from t_friendships f
where f.from_user_id = 'us123' and
f.to_user_id = u.user_id
) and
u.user_id <> 'us123';