Mysql 我可以将多对多关系的层次结构聚合到一个视图中吗?

Mysql 我可以将多对多关系的层次结构聚合到一个视图中吗?,mysql,sql,Mysql,Sql,我正在设计一个关系数据库,在这个数据库中,用户对它的各个部分都有一定的访问级别。让我们把这些部分称为公司、网站和部门。一个公司由一个或多个站点组成,每个站点由一个或多个部门组成。用户和这些实体之间存在多对多关系,每个关系都有一个访问级别 例如,User1可能对CompanyA具有访问级别3,User2可能对CompanyA的Site1具有访问级别1对Site1的DepartmentX。如果用户有权访问某个实体,如公司,则假定他们也有权访问该实体的成员 我想创建一个视图,列出每个部门和每个用户对该

我正在设计一个关系数据库,在这个数据库中,用户对它的各个部分都有一定的访问级别。让我们把这些部分称为公司、网站和部门。一个
公司
由一个或多个
站点
组成,每个
站点
由一个或多个
部门
组成。
用户
和这些实体之间存在多对多关系,每个关系都有一个访问级别

例如,
User1
可能对
CompanyA
具有访问级别
3
User2
可能对
CompanyA
Site1
具有访问级别
1
Site1
DepartmentX
。如果
用户
有权访问某个实体,如公司,则假定他们也有权访问该实体的成员

我想创建一个视图,列出每个
部门
和每个
用户
对该
部门
的相关访问级别

这就是我到目前为止所做的:

SELECT
   Dept.Id AS 'DeptId', User.Id AS 'UserId',
   DeptAccess.RightsLevel AS 'DeptRightsLevel',
   SiteAccess.RightsLevel AS 'SiteRightsLevel'
FROM (Dept, User)
LEFT JOIN DeptAccess
   ON DeptAccess.DeptId=Dept.Id AND DeptAccess.UserId=User.Id
LEFT JOIN SiteAccess
   ON SiteAccess.SiteId=Dept.SiteId AND SiteAccess.UserId=User.Id
WHERE DeptAccess.RightsLevel IS NOT NULL OR SiteAccess.RightsLevel IS NOT NULL
这给出了如下表(假设
DepartmentY
也是
Site1
的一部分):

如何将
CompanyRightsLevel
合并到此表中,以便在表中显示具有公司范围权限的用户


如果我的数据库设置不清楚,请在评论中要求澄清。

经过一小段头脑风暴后,我得出了以下结论:

SELECT
   Dept.Id AS 'DeptId', User.Id AS 'UserId',
   DeptAccess.RightsLevel AS 'DeptRightsLevel',
   SiteAccess.RightsLevel AS 'SiteRightsLevel',
   CompanySiteAccess.RightsLevel AS 'CompanyRightsLevel'
FROM (Dept, User)
LEFT JOIN DeptAccess
   ON DeptAccess.DeptId=Dept.Id AND DeptAccess.UserId=User.Id
LEFT JOIN SiteAccess
   ON SiteAccess.SiteId=Dept.SiteId AND SiteAccess.UserId=User.Id
LEFT JOIN (
      SELECT
         Site.CompanyId,
         Site.Id AS 'SiteId',
         CompanyAccess.UserId,
         CompanyAccess.RightsLevel
      FROM Site
      INNER JOIN CompanyAccess
         ON Site.CompanyId=CompanyAccess.CompanyId
   ) AS CompanySiteAccess
   ON CompanySiteAccess.SiteId=Dept.SiteId AND CompanySiteAccess.UserId=User.Id
WHERE
   DeptAccess.RightsLevel IS NOT NULL OR
   SiteAccess.RightsLevel IS NOT NULL OR
   CompanySiteAccess.RightsLevel IS NOT NULL
不幸的是,它包含一个子查询,因此MySQL将强制将
companyisteaccess
定义为它自己的视图,但它应该正常工作

SELECT
   Dept.Id AS 'DeptId', User.Id AS 'UserId',
   DeptAccess.RightsLevel AS 'DeptRightsLevel',
   SiteAccess.RightsLevel AS 'SiteRightsLevel',
   CompanySiteAccess.RightsLevel AS 'CompanyRightsLevel'
FROM (Dept, User)
LEFT JOIN DeptAccess
   ON DeptAccess.DeptId=Dept.Id AND DeptAccess.UserId=User.Id
LEFT JOIN SiteAccess
   ON SiteAccess.SiteId=Dept.SiteId AND SiteAccess.UserId=User.Id
LEFT JOIN (
      SELECT
         Site.CompanyId,
         Site.Id AS 'SiteId',
         CompanyAccess.UserId,
         CompanyAccess.RightsLevel
      FROM Site
      INNER JOIN CompanyAccess
         ON Site.CompanyId=CompanyAccess.CompanyId
   ) AS CompanySiteAccess
   ON CompanySiteAccess.SiteId=Dept.SiteId AND CompanySiteAccess.UserId=User.Id
WHERE
   DeptAccess.RightsLevel IS NOT NULL OR
   SiteAccess.RightsLevel IS NOT NULL OR
   CompanySiteAccess.RightsLevel IS NOT NULL