考虑以下结构:
alt text http://aeon-dev.org/pap/pap_db.png
忽略表user_token。
现在,假设您需要获得与用户相关的所有角色,可能是通过相关群组或与他直接相关。如果相同的角色直接与组和用户相关,则与该用户相关的角色将胜过该组给出的角色。
是否有可能在单个查询中完成此操作?
干杯!
答案 0 :(得分:2)
试试这个:
Select role_id
From user_has_role
Where userId = @UserId
Union
Select role_id
From user_has_group g
Join Group_has_Role gr
On gr.GroupId = g.GroupId
Where userId = @UserId
答案 1 :(得分:2)
使用:
SELECT DISTINCT r.name AS role_name
FROM USER u
LEFT JOIN USER_HAS_ROLE uhr ON uhr.user_id = u.id
LEFT JOIN USER_HAS_GROUP uhg ON uhg.user_id = u.id
LEFT JOIN GROUP_HAS_ROLE ghr ON ghr.group_id = uhg.group_id
LEFT JOIN ROLE r ON r.id = uhr.role_id
OR r.id = ghr.role_id
WHERE u.username = ?
答案 2 :(得分:1)
您可以找到用户1
的所有不同角色,例如:
select distinct role_id
from (
select uhr.user_id
, uhr.role_id
from user_has_role uhr
union all
select uhg.user_id
, ghr.role_id
from user_has_group uhg
join group_has_role ghr
on ghr.group_id = uhg.group_id
where not exists
(
select *
from user_has_role uhr
where uhr.user_id = uhg.user_id
and uhr.role_id = ghr.role_id
)
) user2role
where user_id = 1
不确定与用户相关的角色应如何“占上风”,但您可以在联盟中为其分配优先级。
答案 3 :(得分:1)
此查询将获得单个用户直接或由组提供的每个角色
SELECT * FROM ROLE WHERE ID IN (
SELECT ROLE_ID
FROM USER_HAS_ROLE
WHERE USER_ID = 1
UNION
SELECT ROLE_ID
FROM USER_HAS_GROUP UG
INNER JOIN GROUP_HAS_ROLE GR ON UG.GROUP_ID = GR.GROUP_ID
WHERE USER_ID = 1
)