SQL:如何检查A列中的两个值是否属于B列中定义的同一组?

时间:2013-07-03 09:01:02

标签: sql postgresql

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

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。 所以必须检查

  1. 有同一组和
  2. urrent_user(Peter)的旗帜“show_groupmembers”是'Y'。
  3. 如果此检查失败(如我的例子中所示),则“EXIST SELECT 1”应该 当然不返回任何东西,否则它应该返回一些东西。

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

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

3 个答案:

答案 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中的保留字。使用更具描述性的列名称。