Я пытаюсь написать 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 должен быть в результате