根据关系选择不同的值

时间:2014-10-23 14:50:11

标签: postgresql select distinct postgresql-9.2

上下文:

给定一个存储用户关系信息的表,单个记录表示单向关系,即 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

2 个答案:

答案 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)
      );