具有连接条件的SQL请求

时间:2019-02-18 14:12:58

标签: mysql sql pdo

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

感谢您的阅读。

2 个答案:

答案 0 :(得分:1)

SQL DEMO

首先,您必须拥有所有玛丽和所有权限

 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 )
       )

输出

enter image description here

答案 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,以便即使没有权限也可以保留所有行。