SELECT mairie.city, permission.permission
FROM permission , user_mairie, mairie
WHERE user_mairie.iduser = 1
AND user_mairie.idmairie = mairie.idmairie
CASE user_mairie.idrole
WHEN 2 THEN
JOIN user_permission
ON user_permission.idpermission = permission.idpermission
AND user_permission.iduser = user_mairie.iduser
END
ORDER BY mairie.idmairie, permission.idpermission
如果此用户具有特定角色,我正在尝试获取特定用户的权限。
“mairie”是法语中的“市政厅”。
用户可以在不同的“mairie”中具有不同的角色。
如果user_mairie上的用户idrole = 2,那么我们必须转到“user_permission”表来获取它的权限。
如果user_mairie上的用户idrole = 1,那么他是admin并且他具有所有权限,但是权限不是写在user_permission中(因为user_permission仅用于idrole = 2)。
我想要的是例如:
如果user_mairie.idrole = 1:
SELECT *
FROM permission
如果user_mairie.idrole = 2
SELECT *
FROM permission, user_permission
WHERE user_mairie.idrole = 2
AND user_mairie.iduser = user_permission.iduser
AND user_permission.idpermission = permission.idpermission
我可以使用我的编程语言和2个请求来做到这一点,但我想知道在纯SQL中,这个问题是否可以解决。
添加日期:
表格权限:
idpermission | permission
1 | permission_1
2 | permission_2
3 | permission_3
User_mairie表:
iduser | idmairie | idrole
1 | 1 | 1
1 | 2 | 2
表user_permission:
iduser | idpermission | idmairie
1 | 1 | 2
1 | 3 | 2
市政厅表:
idmarie | city
1 | mairie_1
2 | mairie_2
我想要的结果(对于给定的iduser = 1)将是:
mairie_1 : permission_1, permission_2, permission_3
mairie_2 : permission_1, permission_3
谢谢你读我
首先,您从所有marie和所有权限开始
SELECT um.idrole, m.city, p.permission
FROM user_mairie um
JOIN mairie m
ON um.idmairie = m.idmairie
CROSS JOIN permission p
WHERE um.iduser = 1
现在你删除了你没有的权限
WHERE um.iduser = 1
AND ( um.idrole = 1 -- have all permission
OR EXISTS (SELECT up.idpermission
FROM user_permission up
WHERE up.iduser = um.iduser
AND up.idpermission = p.idpermission )
)
OUTPUT
我想你真的想要LEFT JOIN
:
SELECT . . .
FROM user_mairie LEFT um
user_permission up
ON um.iduser = up.iduser LEFT JOIN
permission p
ON up.idpermission = p.idpermission OR
um.idrole = 1 ;
你可能不希望idrole
的条件。
这仅获取id角色“2”的权限。
笔记:
SELECT
中所需的所有列。JOIN
语法。切勿在FROM
条款中使用逗号。LEFT JOIN
以便即使没有权限也可以保留所有行。