mySql N到N双联接为null - CROSS从回答加入

时间:2012-03-12 22:53:31

标签: mysql join left-join cross-join

我有两个表,一个称为权限,一个称为角色,这些表通过N-N关系中名为RolePermissions的第三个表相关联。

Permissions
 id <- PK
 name


Roles
 id <- PK
 name

RolePermisions
 RoleId  <-PK
 PermissionId <-PK
 isAllowed

我想要的是获取特定角色的完整权限列表,以及当该角色的RolePermission表中没有值时为NULL。左连接通常可以解决问题,但我无法解决这个问题。

基本上我要说我有以下数值:

In Permsission:

1 - Per1
2 - Per2
3 - Per3

在角色中:

1 - Role1
2 - Role2

在RolePermissions中:

RoleId  -  PermissionId - isAllowed
 1            1             true
 1            2             false
 1            3             true
 2            1             true

以下查询sorta可以工作但不会为那些不在RolePermissions中的值返回NULL:

select permissions.name, rolepermissions.allowed 
FROM permissions LEFT JOIN rolepermissions  
    ON rolepermissions.permissionId = permissions.id 
WHERE rolepermissions.roleId = 2;

查询角色2时我要查找的结果是

Per1 - true
Per2 - NULL
Per3 - NULL

1 个答案:

答案 0 :(得分:0)

您可以使用CROSS JOIN

执行此操作
SELECT
    r.ID AS RoleID,
    p.ID AS PermissionID,
    rp.IsAllowed
FROM
    Roles r CROSS JOIN
    Permissions p LEFT JOIN
    RolePermissions rp ON rp.RoleId = r.ID AND rp.PermissionID = p.ID
WHERE r.ID = @RoleID