0

「users」テーブルと「roles」テーブルの 2 つのテーブルがあり、多対多の関係によって相互に関連付けられています。多対多の関係は、「UserRoles」と呼ばれる 3 番目のテーブルに格納されています。個別のユーザーを表示するクエリを作成し、特定のユーザーに関連付けられているすべてのロールを 1 つの行に表示したいと考えています。

たとえば、次の 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 を使用していると仮定すると、次の関数を使用できるはずです。

関数 [dbo] を作成します。[GetUserRoles] (@UserId varchar(50))RETURNS varchar(max) AS

始める

@result varchar(max) を宣言します
select @result = ''
 select @result = @result + r.rolename+';' from ROLES as r inner join USERROLES as rr on rr.roleid = r.roleid
 および rr.userid=@UserId

 if charindex(';',@result) >0
 始める
 SELECT @result = SUBSTRING(@result, 1, NULLIF(DATALENGTH(@result)-1,-1))
 終わり

@結果を返す
終わり

次に、次のように関数を呼び出します。

ユーザー名を選択、[dbo].[GetUserRoles](userid)
dbo.users から
于 2013-06-10T08:05:46.600 に答える