user group show_groupmembers ---------------------------------- Bob Alpha Y Peter Alpha N Peter Beta Y Chris Beta Y
如果show_groupmembers为“Y”,则用户可以看到其组中的所有其他成员。 (所以鲍勃可以看到所有“Alpha” - 组用户)
如果show_groupmembers为“N”,则用户无法看到其组中的任何成员 (所以彼得例如看不到任何“Alpha” - 组用户)
我有一个current_user,Peter想要检查Peter是否可以看到Bob。 所以必须检查
如果此检查失败(如我的例子中所示),则“EXIST SELECT 1”应该 当然不返回任何东西,否则它应该返回一些东西。
我见过有效的解决方案,但前提是current_user只是一个组的成员。只要他是更多的团体,上面的检查似乎不起作用。
任何想法如何执行此操作?我完全坚持了。
答案 0 :(得分: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
答案 1 :(得分:0)
由于您提到使用exists:
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 )
如果你想检查彼得是否能看到鲍勃:
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 )
答案 2 :(得分: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中的保留字。使用更具描述性的列名称。