0

MySQL データベースにこのような 3 つのテーブルがあるとします。


1. User(userId,name)
2. Role(roleId,role)
3. UserRoleMap(userRoleId,userId,roleId)

1 人のユーザーが複数の役割を持つ場合があります。
ユーザーが複数のroleを持っている場合、最初に来るロールを 1 つ選択する必要がありますhierarchy(Pre-defined)。階層の順序は、たとえば、Johnに 2 つのロール(管理者、ユーザー) がある場合、予想される出力は次のようになります。 1.Admin,2.Supervisor,3.User.

+----------+-----------+
|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;


ありがとう。すべての答えをいただければ幸いです。

4

3 に答える 3

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

編集

fieldasを使用して順序を指定できます。

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
于 2013-09-14T17:32:35.717 に答える
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;

于 2013-09-14T19:37:31.010 に答える
0

ロールを直接保存するのではなく、別の方法を使用する必要があります。

各ロールに 2 の累乗を割り当てます。例: ユーザー - 1 管理者 - 2 スーパーバイザー 4

ユーザーが複数の役割を持っている場合は、それらを追加するだけです。したがって、誰かがユーザーとスーパーバイザーの両方である場合、データベースに「5」を保存します。

これにより、次のようなことができるようになったため、クエリがはるかに簡単になります。

CASE
    WHEN role >= 1 THEN 'User'
    WHEN role >= 2 THEN 'Admin'
    WHEN role >= 4 THEN 'Supervisor'
END
于 2013-09-14T17:44:02.590 に答える