在角色表的users表中包含admin角色

时间:2010-01-14 12:08:58

标签: sql mysql roles rbac

有没有办法像这样查询用户表:

| id | username |
-----------------
| 1  | user1    |
| 2  | user2    |
| 3  | user3    |

和user_roles表:

| id_user | id_role |
---------------------
|    1    |    1    |
|    1    |    2    |
|    1    |    3    |
|    2    |    2    |
|    3    |    1    |

假设id = 1的角色是管理员角色,以产生如下所示的结果:

| id | username | admin |
-------------------------
| 1  | user1    |   Y   |
| 2  | user2    |   N   |
| 3  | user3    |   Y   |

我认为可以使用嵌套的SELECT语句来完成,但我想知道它是否可以使用JOIN。

编辑: 管理列值不必是Y或N,它可以是管理员角色id(1)或NULL或任何让我知道用户是否为管理员

3 个答案:

答案 0 :(得分:1)

好吧,您可以像这样加入,这会在结果中为您提供id_role

SELECT u.*, r.id_role
FROM users u
LEFT JOIN user_roles r
ON u.id=r.id_user

您可以添加WHERE r.id_role=1以获取管理员等等。

但是要将管理员设为“Y”或“N”,您可以使用IF来判断id_role是否为1。

SELECT u.*, IF(r.id_role = 1, "Y", "N") as admin
FROM users u
LEFT JOIN user_roles r
ON u.id=r.id_user

答案 1 :(得分:1)

我会试试这个:

select u.id, u.username, if (id_role is null,  'N', 'Y') as is_admin
  from users u
  left outer join user_roles r
    on u.id = r.id_user and r.id_role = 1

但我不是百分百肯定。

答案 2 :(得分:0)

select u.id_user, if(count(1) > 0, 'Y', 'N')
from user u left outer join user_roles ur on u.user_id = ur.user_roles
where ur.id_role=1
group by u.id_user

我没有使用mysql,所以只是谷歌搜索它有'if'函数,如果这是错误的,用DECODE,COALESCE或类似的替换。