我有一种情况,我有两个表'用户'和'角色'表,它们通过多对多关系相互关联,存储在名为'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
答案 0 :(得分: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`
答案 1 :(得分:0)
假设您使用的是MS SQL,则应该可以使用以下函数:
create FUNCTION [dbo].[GetUserRoles] (@UserId varchar(50))RETURNS varchar(max) AS BEGIN declare @result varchar(max) select @result = '' select @result = @result + r.rolename+';' from ROLES as r inner join USERROLES as rr on rr.roleid = r.roleid and rr.userid=@UserId if charindex(';',@result) >0 begin SELECT @result = SUBSTRING(@result, 1, NULLIF(DATALENGTH(@result)-1,-1)) end return @result end
然后调用这个函数:
select username, [dbo].[GetUserRoles](userid) from dbo.users