У меня Проекты в иерархии
Project1.Projects
+- Project1.1
+- Project1.2
Project2.Projects
+- Project2.1
+- Project2.2
Project3.Projects
+- Project3.1
Пользователям назначаются разрешения для проекта через UserProject
User.Id --> UserProject.Id.UserId
UserProject.Id.ProjectId --> Project.Id
(Да, это составной идентификатор, извините ... устаревшая база данных, что вы собираетесь делать ...)
Теперь мне нужен список всех лучших проектов, в которых конкретный пользователь имеет доступ к проекту или хотя бы к одному из подпроектов .
Так что, если у UserA есть доступ к Project1 и Project3.1, я хочу получить список, содержащий Project1 и Project3 (, а не 3.1 ), предпочтительно с некоторой информацией о том, что у пользователя нет прав для Project3.
В базе данных проекты хранятся в плоском виде с родительской ссылкой:
Project:
| Project_ID | Parent_project_id | HasSubProjects | ... |
UserProject
| ProjectID | UserId | other properties... |
Есть предложения по эффективному способу вернуть то, что я хочу?
Обновление : я закончил с массивным SQL-оператором, использующим объединения и иерархические объединения. Довольно зверь. Спасибо за помощь.