Как отфильтровать запрос по связанным привилегиям - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь написать select, который фильтрует пользователей, указав хотя бы одно разрешение с display = 1. Мои таблицы выглядят следующим образом:

User:
-id
-user_email_id

UserGroupRelation:
-id
-user_id
-user_email_id
-user_group_id

UserGroupPermission
-id
-permission_id
-display(bool)
-user_group_id

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

Это то, что я пытался, и это не сработало.

SELECT *
FROM User as u
LEFT OUTER JOIN
    UserGroupRelation as ugr on ugr.user_id = u.id and ugr.user_email_id = u.user_email_id
LEFT OUTER JOIN
    UserGroupPermission as ugp on ugp.user_group_id = ugr.user_group_id
WHERE
    ugp.display = 1

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

Пример данных:

  User:
    {id=1, user_email_id=1}, 
    {id=2, user_email_id=2}

  UserGroupRelation: 
    {id-1, user_group_id=1, user_id=1, user_email_id=1}, 
    {id=2, usergroup_id=2, user_id=2, user_email_id=2}

  UsergroupPermission: 
    {id=1, permission_id=1, display=1, user_group_id=1}, 
    {id=2, permission_id=1, display=0, user_group_id=2}

Результат должен возвращать только пользователя, который имеет id = 1, потому что он подключен к group_id= 1, у которого есть разрешение с display = 1, у пользователя с идентификатором 2 нет результата, потому что у него есть разрешение с display = 0. Это простой пример, потому что у пользователя может быть несколько групп, а у группы может быть несколько разрешений, но только одна с h какdisplay = 1 должен быть в результате

1 Ответ

0 голосов
/ 07 ноября 2019

Я считаю, что ваш SELECT просто плохо отформатирован. Попробуйте выполнить следующее вместо того, что вы поделились выше:

SELECT * FROM @User AS u
INNER JOIN UserGroupRelation AS ugr 
    ON ugr.[user_id] = u.id AND ugr.user_email_id = u.user_email_id
LEFT OUTER JOIN UserGroupPermission AS ugp
    ON ugp.user_group_id = ugr.user_group_id
WHERE
    ugp.display = 1;

Если я выполню это в моей тестовой среде с вашими примерами данных, я получу следующий набор результатов:

+----+---------------+----+---------+---------------+---------------+----+---------------+---------+---------------+
| id | user_email_id | id | user_id | user_email_id | user_group_id | id | permission_id | display | user_group_id |
+----+---------------+----+---------+---------------+---------------+----+---------------+---------+---------------+
|  1 |             1 |  1 |       1 |             1 |             1 |  1 |             1 |       1 |             1 |
+----+---------------+----+---------+---------------+---------------+----+---------------+---------+---------------+

С другой стороны, я бы изменил LEFT OUTER JOIN UserGroupPermission AS ugp на INNER JOIN UserGroupPermission AS ugp, учитывая, что в ожидаемом наборе результатов требуется «отображение».

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