2

这是我的数据库“用户”:

用户组 show_groupmembers
----------------------------------
鲍勃阿尔法Y
彼得阿尔法 N
彼得贝塔 Y
克里斯贝塔Y

如果 show_groupmembers 为“Y”,则用户可以看到其组的所有其他成员。(例如 Bob 可以看到所有“Alpha”组用户)

如果 show_groupmembers 是“N”,则用户看不到他的组的任何成员(例如,Peter 看不到任何“Alpha”组用户)

这就是我想做的:

我有一个 current_user,Peter,想检查一下 Peter 是否可以看到 Bob。所以必须检查

  1. 有在同一组和
  2. urrent_user (Peter) 的标志“show_groupmembers”是“Y”。

如果此检查失败(如在我的示例中),“EXIST SELECT 1”当然应该什么都不返回,否则它应该返回一些东西。

我见过有效的解决方案,但前提是 current_user 只是一个组的成员。一旦他是更多组,上面的检查似乎不起作用。

任何想法如何执行此操作?我完全坚持这一点。

4

3 回答 3

0

由于您提到使用存在:

select u1.user, u1.group, u1.show_groupmembers
from users u1
where exists ( select 1
              from users u2
              where u2.user = 'Peter'
              and u2.show_groupmembers = 'Y'
              and u1.group = u2.group )

一些编辑:

如果您想要 Peter 在某个组中可以看到的用户列表:

select u1.user, u1.group, u1.show_groupmembers
from users u1
where u1.group = 'Alpha'
and exists ( select 1
              from users u2
              where u2.user = 'Peter'
              and u2.show_groupmembers = 'Y'
              and u1.group = u2.group )

如果您想检查 Peter 是否可以看到 Bob:

select u1.user, u1.group, u1.show_groupmembers
from users u1
where u1.user = 'Bob'
and exists ( select 1
              from users u2
              where u2.user = 'Peter'
              and u2.show_groupmembers = 'Y'
              and u1.group = u2.group )
于 2013-07-03T09:15:50.803 回答
0

返回 1 彼得可以看到鲍勃;否则,返回 0。

with can_u1 as (
  select * from table1 where "user" = 'Peter'
),
see_u2 as (
  select * from table1 where "user" = 'Bob'
)
select count(*)
from can_u1
inner join see_u2 on can_u1."group" = see_u2."group"
and can_u1.show_groupmembers = 'Y'
where can_u1."group" = 'Alpha'

如果您同时命名两个用户,我认为这种特定类型的查询更容易维护。返回计数可确保信息不会泄露给用户,尽管尚不清楚这是否对您来说是个问题。

“用户”和“组”都是 PostgreSQL 中的保留字。使用更具描述性的列名。

于 2013-07-03T09:28:58.557 回答
0
select u1.user, u1.group, u1.show_groupmembers
from users u1
join (select user, group, show_groupmembers 
        from users where user = 'Joe' and show_groupmembers = 'Y'
) u2
on u1.group = u2.group;

看到这个小提琴:http ://sqlfiddle.com/#!1/22ff1/7

于 2013-07-03T09:04:55.647 回答