MySQL JOIN из 3 относительных таблиц - PullRequest
1 голос
/ 23 января 2011

у меня 3 стола
1. роль (id, ...)
2. разрешение (id, ...)
3. role_permission (id, role_id, license_id)

Я хочу сделать следующее: я должен выбрать все роли и все разрешения для этих ролей с помощью одного запроса. Мой тестовый запрос:

SELECT `rp`.*, `r`.`role`, `r`.`id` AS `role_id`, `p`.`id` AS 
`permission_id`,`p`.`name` AS `permission` FROM `role_permission` AS `rp` RIGHT JOIN 
`role` AS `r` ON r.id = rp.role_id RIGHT JOIN `permission` AS `p` ON p.id = rp.permission_id

Но этот запрос выбирает только те роли, на которые есть разрешения. Но мне нужно выбрать все роли и все разрешения (существует строка в role_permission или нет).

Спасибо заранее Извините за мой английский.

Ответы [ 2 ]

2 голосов
/ 23 января 2011

Требуется left join.

select
    r.role, 
    r.id as role_id,
    p.id as permission_id

from role

left join role_permission rp on rp.role_id = role.id
left join permission p on p.id = rp.permission_id

Это даст вам разрешения для всех ролей с разрешениями, а также ноль permission_id для ролей без разрешений.

1 голос
/ 23 января 2011

Вам нужно выбрать все роли в запросе, затем все разрешения в другом, пересечь их и, наконец, оставить соединение с role_permissions, чтобы получить полный список ролей x разрешений

SELECT rp.*, r.role, r.id AS role_id, p.id AS permission_id,p.name AS permission
FROM permission AS p
CROSS JOIN  role AS r
LEFT JOIN role_permission AS rp ON p.id = rp.permission_id
  AND r.id = rp.role_id

Перекрестное объединение дает вам полную матрицу комбинаций разрешений роли х, и соединение ВЛЕВО завершается успешно, даже если в строке role_permission нет записей для строки (роли, разрешения) в полной матрице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...