给定一个存储用户关系信息的表,单个记录表示单向关系,即 user_1 在记录列中 user_2 用户ID '是user_1和列' relateduserid '是user_2。如果存在第二条记录,其中用户列' userid'是user_2和column' relateduserid'是user_1然后我们考虑这两个朋友'这种关系(逻辑上)被认为是双向的。
编辑:所有用户信息都存储在一个单独的"用户"表
我希望得到所有不同用户单位的单向关系(即只有一条记录,我的用户ID和我关注的人的用户ID出现),其中相关用户标识 NOT 给定的用户ID。
我尝试过多次不能返回正确结果的查询,例如使用distinct userid返回 all 表中的userid。
select distinct userid from userRelTable where relateduserid <> 1234
答案 0 :(得分:1)
给定两个表user和userRelTable,我用六个用户填充了用户表,并用六个关系填充了userRelTable。
ID userid ----------- 1 user_1 2 user_2 3 user_3 4 user_4 5 user_5 6 user_6
ID userid relateduserid ------------------------- 1 user_1 user_2 2 user_2 user_1 3 user_2 user_3 4 user_3 user_1 5 user_4 user_6 6 user_5 user_6
根据条件,此查询将为您提供与'user_2'既没有单向或双向关系的所有用户
select * from [user]
where [user].userid
not in
(
select userid from userRelTable
where userRelTable.userid = 'user_2'
or userRelTable.relateduserid = 'user_2'
)
and [user].userid
not in
(
select relateduserid from userRelTable
where userRelTable.userid = 'user_2'
or userRelTable.relateduserid = 'user_2'
)
结果如下表所示:
ID userid ----------- 4 user_4 5 user_5 6 user_6
唯一有问题的是user_3。根据定义,user_3不应该在结果集中,因为在ID#3处与user_2存在单向关系。
答案 1 :(得分:1)
此查询将选择单向关系,过滤掉双向:
SELECT userid, relateduserid FROM userRelTable
EXCEPT ALL
SELECT relateduserid, userid FROM userRelTable;
使用此作为基线,您可以根据具体情况对结果进行预过滤或后置过滤。
例如,要获得单向关系中的所有不同userid
,除了跟随或跟随用户ID 1234
的人之外,这应该有效:
SELECT distinct u.userid FROM
(
SELECT userid, relateduserid FROM userRelTable
EXCEPT ALL
SELECT relateduserid, userid FROM userRelTable
) u
WHERE NOT EXISTS (
SELECT 1 from userRelTable r
WHERE (r.userid=u.userid AND r.relateduserid=1234)
OR (r.userid=1234 AND u.userid=r.relateduserid)
);