MySQL-复杂数据查询在一个语句中

时间:2010-06-08 14:28:17

标签: sql mysql

考虑以下结构:

alt text http://aeon-dev.org/pap/pap_db.png

忽略表user_token。

现在,假设您需要获得与用户相关的所有角色,可能是通过相关群组或与他直接相关。如果相同的角色直接与组和用户相关,则与该用户相关的角色将胜过该组给出的角色。

是否有可能在单个查询中完成此操作?

干杯!

4 个答案:

答案 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
)