SQL - 选择用户可直接访问或通过其组访问的资源

时间:2011-12-09 14:04:11

标签: sql select inner-join

我正在尝试列出用户有权访问的所有资源。他可以直接访问(用户权限)或者在可以访问资源的组中(组权限)。

我的表格是:

  • group:id,name
  • user:id,name
  • 资源:id,name
  • rel_resource_user:资源,用户
  • rel_group_resource:group,resource
  • rel_group_user:group,user

我尝试了以下查询:

SELECT DISTINCT resource.id 
FROM resource 
LEFT OUTER JOIN rel_group_resource ON resource.id = rel_group_resource.resource 
INNER JOIN `group` ON rel_group_resource.`group` = `group`.id 
INNER JOIN rel_group_user ON rel_group_user.`group` = `group`.id 
LEFT OUTER JOIN rel_resource_user ON rel_resource_user.resource = resource.id 
WHERE rel_resource_user.user = 1 OR rel_group_user.user = 1

但我只通过组接收资源,而不是直接接收用户。如果我在两个查询中剪切查询,一个用于组访问的资源,一个用户直接查看,它可以工作。但是我无法在一个查询中获得所有资源。

谢谢你的帮助!!!

4 个答案:

答案 0 :(得分:1)

你可以试着像这样使用两个where resource.id in

select resource.id 
from resource
where resource.id in (select rel_resource_user.resource
                      from rel_resource_user
                      where rel_resource_user.user = 1) or
      resource.id in (select rel_group_resource.resource
                      from rel_group_resource
                        inner join rel_group_user
                          on rel_group_resource.group = rel_group_user.group
                      where rel_group_user.user = 1)

答案 1 :(得分:0)

如果它们具有相同数量的输出字段和相同类型,则可以使用UNIONUNION ALL,唯一的区别是UNION可以删除重复项。

SELECT
   ResourceID
FROM 
   FIRSTTABLE
UNION ALL
SELECT ResourcedID
FROM
   SecondTable

答案 2 :(得分:0)

SELECT r.id 
FROM resource AS r
WHERE EXISTS 
      ( SELECT *
        FROM rel_resource_user AS ru
        WHERE ru.resource = r.id
          AND ru.user = 1
      )
   OR EXISTS 
      ( SELECT *
        FROM rel_group_user AS gu
          JOIN `group` AS g
            ON g.id = gu.`group`
          JOIN rel_group_resource AS gr
            ON gr.`group` = g.id
        WHERE gr.resource = r.id
          AND gu.user = 1
      )

答案 3 :(得分:0)

尝试此查询:

select Resource_id  from
(
    select rel_resource_user.resource as Resource_id,user.id as user_id FROM user inner join rel_resource_user on rel_resource_user.user=user.id
UNION
     SELECT rel_group_resource..resource as Resource_id,rel_group_user.user as user_id FROM group inner join rel_group_resource on group.id= rel_group_resource.group INNER JOIN rel_group_user.group= group.id
)