假设我在MySQL DataBase中有三个这样的表。
1. User(userId,name)
2. Role(roleId,role)
3. UserRoleMap(userRoleId,userId,roleId)
一个用户可能有多个角色。
如果用户有多个role
,我必须选择hierarchy(Pre-defined)
中首先出现的一个角色。层次结构的顺序为1.Admin,2.Supervisor,3.User.
例如,如果 John 有两个角色(管理员,用户),那么我的预期输出是:
+----------+-----------+
|John |Admin | (John have two roles:User,Admin)
|Vishal |Supervisor | (Vishal have two roles:User,Supervisor)
在查询的最终结果中。
select user.name,
FIND_IN_SET(trim(role.role),'Admin,Supervisor,User') as 'roleIndex',
(case when(FIND_IN_SET(trim(role.role),'Admin,Supervisor,User')=1) then
'Admin'
else
case when(FIND_IN_SET(trim(role.role),'Admin,Supervisor,User')=2) then
'Supervisor'
else
case when(FIND_IN_SET(trim(role.role),'Admin,Supervisor,User')=3) then
'User'
end
end
end) as role
from
User user
inner join UserRoleMap userRole on user.userId = userRole.userId
inner join Role role on role.roleId = userRole.roleId
group by user.userId;
谢谢。每个答案都会很感激。
答案 0 :(得分:2)
我不确定我的答案。无论如何,我希望这会对你有所帮助
SELECT A.name, C.role
FROM `user` A
JOIN userrolemap B ON A.`userId` = B.`userId`
JOIN role C ON B.roleId = C.roleId
ORDER BY C.roleId, A.name
修改强>
您可以使用field
作为
SELECT A.name, C.role
FROM `user` A
JOIN userrolemap B ON A.`userId` = B.`userId`
JOIN role C ON B.roleId = C.roleId
ORDER BY FIELD( C.role, 3, 1, 2 ),A.name
修改强>
SELECT A.name, C.role
FROM `user` A
JOIN userrolemap B ON A.`userId` = B.`userId`
JOIN role C ON B.roleId = C.roleId
GROUP BY A.userId
ORDER BY FIELD( C.role, 3, 1, 2 ) , A.name
答案 1 :(得分:0)
不应直接保存角色,而应该采用不同的方法。
您为每个角色分配2的幂。 例如: 用户 - 1 管理员 - 2 主管4
如果用户有多个角色,您只需将其添加即可。因此,当某人同时是用户和主管时,您将在数据库中保存“5”。
这使您的查询更容易,因为现在您可以执行以下操作:
CASE
WHEN role >= 1 THEN 'User'
WHEN role >= 2 THEN 'Admin'
WHEN role >= 4 THEN 'Supervisor'
END
答案 2 :(得分:0)
最后我得到了解决方案
select user.name,
case when (GROUP_CONCAT(role.role) like '%Admin%') then
'Admin'
else
case when (GROUP_CONCAT(role.role) like '%Supervisor%') then
'Supervisor'
else
case when (GROUP_CONCAT(role.role) like '%User%') then
'User'
end
end
end as 'role'
from User user, Role role, UserRoleMap userRole where
user.userId = userRole.userId and
role.roleId = userRole.roleId
group by user.userId;