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