我正在尝试列出用户有权访问的所有资源。他可以直接访问(用户权限)或者在可以访问资源的组中(组权限)。
我的表格是:
我尝试了以下查询:
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
但我只通过组接收资源,而不是直接接收用户。如果我在两个查询中剪切查询,一个用于组访问的资源,一个用户直接查看,它可以工作。但是我无法在一个查询中获得所有资源。
谢谢你的帮助!!!
答案 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)
如果它们具有相同数量的输出字段和相同类型,则可以使用UNION
或UNION 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
)