0

我有一种情况,我有 2 个表“用户”和“角色”表,它们通过多对多关系相互关联,多对多关系存储在名为“UserRoles”的第三个表中。我想编写一个查询来显示不同的用户,但在一行中显示与特定用户关联的所有角色。

比如下面的3张表:

users   
UserName    UserId
test11      000_1
test12      000_2
test13      000_3
test14      000_5

roles   
Role Name   Role ID
Admin       100_1
superuser   100_2
reader      100_3
writer      100_4

UserRoles   
RoleID  UserID
100_1   000_1
100_2   000_1
100_3   000_1
100_2   000_2
100_3   000_2
100_4   000_2
100_3   000_3
100_4   000_3
100_1   000_5
100_2   000_5
100_3   000_5
100_4   000_5

那么如何编写一个查询,显示如下一行,每个用户的角色用分号分隔?

UserName    Role Name
test11      Admin;superuser;reader  
4

2 回答 2

1

如果我们要完全相信您的问题并假设您使用的是 MySQL:

select UserName, 
    GROUP_CONCAT(DISTINCT r.`Role Name` SEPARATOR ';') as `Role Name`
  FROM users u JOIN UserRoles ur on u.UserId = ur.UserID 
       JOIN roles r on ur.RoleId = r.`Role ID`
于 2013-06-10T07:52:39.757 回答
0

假设您使用的是 MS SQL,您应该能够使用以下函数:

创建 FUNCTION [dbo].[GetUserRoles] (@UserId varchar(50))RETURNS varchar(max) AS

开始

声明@result varchar(max)
选择@结果 = ''
 选择@result = @result + r.rolename+';' from ROLES as r inner join USERROLES as rr on rr.roleid = r.roleid
 和 rr.userid=@UserId

 如果 charindex(';',@result) >0
 开始
 SELECT @result = SUBSTRING(@result, 1, NULLIF(DATALENGTH(@result)-1,-1))
 结尾

返回@结果
结尾

然后像这样调用函数:

选择用户名,[dbo].[GetUserRoles](userid)
来自 dbo.users
于 2013-06-10T08:05:46.600 回答