具有连接条件的SQL请求

问题描述 投票:-1回答:2
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

谢谢你读我

mysql sql pdo
2个回答
1
投票

SQL DEMO

首先,您从所有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

enter image description here


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语法。切勿在FROM条款中使用逗号。
  • 表别名使查询更易于编写和读取。
  • 使用LEFT JOIN以便即使没有权限也可以保留所有行。
© www.soinside.com 2019 - 2024. All rights reserved.