Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql不包括已经存在的友谊关系_Sql_Postgresql - Fatal编程技术网

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';