SQL - выберите ресурсы, доступные пользователю напрямую или через его группу - PullRequest
1 голос
/ 09 декабря 2011

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

Мои таблицы будут:

  • группа: идентификатор, имя
  • пользователь: id, имя
  • ресурс: id, имя
  • rel_resource_user: ресурс, пользователь
  • rel_group_resource: группа, ресурс
  • rel_group_user: группа, пользователь

Я пробовал следующий запрос:

SELECT DISTINCT resource.id 
FROM resource 
LEFT OUTER JOIN rel_group_resource ON resource.id = rel_group_resource.resource 
INNER JOIN `group` ON rel_group_resource.`group` = `group`.id 
INNER JOIN rel_group_user ON rel_group_user.`group` = `group`.id 
LEFT OUTER JOIN rel_resource_user ON rel_resource_user.resource = resource.id 
WHERE rel_resource_user.user = 1 OR rel_group_user.user = 1

Но я получаю доступ только к ресурсам через группу, а не напрямую от пользователя. Если я разделю запрос на два запроса, один для ресурсов, к которым обращаются группы, а другой для пользователей напрямую, это работает. Но я не могу получить все ресурсы за один запрос.

Спасибо за помощь !!!

Ответы [ 4 ]

1 голос
/ 09 декабря 2011

Вы можете попробовать использовать два where resource.id in, например:

select resource.id 
from resource
where resource.id in (select rel_resource_user.resource
                      from rel_resource_user
                      where rel_resource_user.user = 1) or
      resource.id in (select rel_group_resource.resource
                      from rel_group_resource
                        inner join rel_group_user
                          on rel_group_resource.group = rel_group_user.group
                      where rel_group_user.user = 1)
0 голосов
/ 09 декабря 2011

попробуйте этот запрос:

select Resource_id  from
(
    select rel_resource_user.resource as Resource_id,user.id as user_id FROM user inner join rel_resource_user on rel_resource_user.user=user.id
UNION
     SELECT rel_group_resource..resource as Resource_id,rel_group_user.user as user_id FROM group inner join rel_group_resource on group.id= rel_group_resource.group INNER JOIN rel_group_user.group= group.id
)
0 голосов
/ 09 декабря 2011
SELECT r.id 
FROM resource AS r
WHERE EXISTS 
      ( SELECT *
        FROM rel_resource_user AS ru
        WHERE ru.resource = r.id
          AND ru.user = 1
      )
   OR EXISTS 
      ( SELECT *
        FROM rel_group_user AS gu
          JOIN `group` AS g
            ON g.id = gu.`group`
          JOIN rel_group_resource AS gr
            ON gr.`group` = g.id
        WHERE gr.resource = r.id
          AND gu.user = 1
      )
0 голосов
/ 09 декабря 2011

Если у них одинаковое количество полей вывода и тот же тип, который вы можете использовать UNION или UNION ALL, единственное отличие состоит в том, что UNION избавляется от дубликатов.

SELECT
   ResourceID
FROM 
   FIRSTTABLE
UNION ALL
SELECT ResourcedID
FROM
   SecondTable
...