объединение нескольких таблиц и возврат нуля, если не строки в одной - PullRequest
0 голосов
/ 19 июня 2019

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

У меня есть 4 соответствующие таблицы

Разрешение (содержит все возможные разрешения)

|permission_name | description |
--------------------------------
|users.list      | etc. etc.   |
|users.update    | etc. etc.   |
|users.delete    | etc. etc.   |

Пользователь

| id      | fname | group_id |
------------------------------
| 1       | John  | 1        |
| 2       | Nancy | 1        |
| 3       | Paul  | 2        |

Группа

| group_id | group_name |
-------------------------
| 1        | Webmasters |
| 2        | Corporate  |
| 3        | HR         |

Group_permission (содержит разрешения, относящиеся к каждой группе)

| group_id | permission_name | permission_type (1=Y|0=not set|-1=N)
----------------------------------------------
| 1        | users.list      | 1              |
| 1        | users.update    | 1              |
| 2        | users.list      | 1              |

ОК, такпроисходит много отношений, но я пытаюсь получить ВСЕ разрешения группы для конкретного пользователя, ДАЖЕ, если разрешение группы еще не существует.

Я представлял, что это какое-то левое соединение с использованием таблицы разрешений в качестве базы, но всякий раз, когда я включаю WHERE user.id = 2, это ограничивает мой результат и не будет содержать нулевые значения с правой стороны..

SELECT a.permission_name, IFNULL(b.permission_type, 0)
FROM permission a
LEFT JOIN group_permission b on b.permission_name = a.permission_name
LEFT JOIN user c on c.group_id = b.group_id
WHERE c.id = 2

результат, который я хочу увидеть для Нэнси:

|permission_name | permission_type |
------------------------------------
|users.list      | 1               |
|users.update    | 0               |
|users.delete    | 0               |

Я не буду знать, в какую группу входит пользователь на стороне PHP, поэтому я должен сделать запрос поиспользуя только идентификатор пользователя.

Все, что я получаю, это

|permission_name | permission_type |
------------------------------------
|users.list      | 1               |

Любая помощь приветствуется.ТИА

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Не уверен на 100%, что это будет работать, но попробуйте присоединить таблицу group_permissions к таблице разрешений.

SELECT a.permission_name, IFNULL(b.permission_type, 0)
FROM group_permission a
LEFT JOIN permission b on a.permission_name = b.permission_name
LEFT JOIN user c on c.group_id = b.group_id
WHERE c.id = 2
0 голосов
/ 19 июня 2019

Это оказалось просто подзапросом, который добился цели.

SELECT a.permission_name, IFNULL(b.permission_type, 0)
FROM permission a
NATURAL LEFT JOIN 
(
    SELECT a.group_id, a.permission_name, a.permission_type FROM group_permission a
    NATURAL LEFT JOIN users b
    WHERE b.id = 2
) as b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...