1

我有三个表:用户、角色、授权

用户

|username|lastName|firstName|....
|dan     |foo     |dan
|russ    |bar     |russ

角色

|role                 |roleLevel
|ROLE_ADMIN           | 0
|ROLE_COMPANY_ADMIN   | 20
|ROLE_MARKETING_ADMIN | 50
|ROLE_SERVICE_ADMIN   | 80
|ROLE_USER            | 100

当局

|username|authority
|dan     |ROLE_SERVICE_ADMIN  |
|dan     |ROLE_USER           |
|russ    |ROLE_MARKETING_ADMIN|
|russ    |ROLE_ADMIN          |
|russ    |ROLE_COMPANY_ADMIN  |

我需要让所有角色级别高于我传入的 INT 的 DISTINCT 用户以及他们的最低角色级别

我现在拥有的是:

SELECT DISTINCT u.username, u.firstName, u.lastName, r.roleLevel FROM AUTHORITIES a, ROLES r, USERS u
WHERE r.role =  a.authority
AND a.username = u.username 
AND r.roleLevel >= #{roleLevel} 
ORDER BY u.lastName, u.firstName

但这为具有多个角色的用户提供了多行。如何获得角色级别低于我传入的用户?

4

3 回答 3

1

假设一个用户可以有多行,您需要确定如何显示角色。

SELECT DISTINCT u.username, u.firstName, u.lastName, 
    max(r.roleLevel) largestRoleLevel,
    min(r.roleLevel) minimumRoleLevel,
    GROUP_CONCAT(r.roleLevel SEPARATOR ', ') allRoleLevels
FROM USERS u
INNER JOIN AUTHORITIES a ON a.username = u.username
INNER JOIN ROLES r ON r.role = a.authority

WHERE r.roleLevel >= #{roleLevel} 
GROUP BY u.username, u.firstname, u.lastname
ORDER BY u.lastName, u.firstName
于 2011-08-21T20:39:44.973 回答
1

它给了你多行,因为你没有指定你想要最低的;再加上你使用了大于而不是低于。

SELECT u.username, u.firstName, u.lastName, min(r.roleLevel) minroleLevel
  FROM AUTHORITIES a, ROLES r, USERS u
 WHERE r.role =  a.authority
   AND a.username = u.username 
   AND r.roleLevel <= #{roleLevel}
 GROUP BY u.username, u.firstName, u.lastName 
 ORDER BY u.lastName, u.firstName
于 2011-08-21T20:43:14.927 回答
0
SELECT 
    u.username, u.firstName, u.lastName, 
    min(r.roleLevel) minRoleLevel
FROM 
    authorities a 
    JOIN roles r ON r.role = a.authority
    JOIN users u ON u.username = a.username
GROUP BY 
    u.username, u.firstName, u.lastName 
HAVING 
    minRoleLevel >= #{roleLevel}
ORDER BY 
    u.lastName, u.firstName
于 2011-08-21T21:59:33.477 回答