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,并且具有ALL权限,但是这些权限未写入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
感谢您的阅读。
答案 0 :(得分:1)
首先,您必须拥有所有玛丽和所有权限
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 )
)
输出
答案 1 :(得分:0)
我认为您真的想要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
语法。请勿在{{1}}子句中使用逗号。FROM
,以便即使没有权限也可以保留所有行。