mySql N to N двойное соединение с нулем - CROSS объединение из ответа - PullRequest
0 голосов
/ 13 марта 2012

У меня есть две таблицы, одна из которых называется разрешениями, а другая - ролями, которые связаны через третью таблицу, называемую RolePermissions в отношении NN.

Permissions
 id <- PK
 name


Roles
 id <- PK
 name

RolePermisions
 RoleId  <-PK
 PermissionId <-PK
 isAllowed

Мне нужно получить полный список разрешенийконкретной роли и значениями NULL, если в таблице RolePermission нет значения для этой роли.Левые объединения обычно делают свое дело, но я не могу решить это.

В основном, допустим, у меня есть следующие значения:

В 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

Следующий запрос вида работает, но он не будет возвращать значения NULL для тех значений, которых нет в RolePermissions:

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 голосов
/ 13 марта 2012

Вы можете сделать это с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...