连接具有多对多关系的表,并在一行上显示查询结果

时间:2013-06-10 07:37:26

标签: sql

我有一种情况,我有两个表'用户'和'角色'表,它们通过多对多关系相互关联,存储在名为'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  

2 个答案:

答案 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
相关问题