我正在设计一个关系数据库,其中用户对其各个部分具有某些访问级别。可以将这些部分称为Company
,Site
和Department
。 Company
由一个或多个Site
组成,每个Site
由一个或多个Department
组成。 User
与每个实体之间存在多对多关系,每个关系都具有访问级别。
例如,User1
可能具有3
到CompanyA
的访问级别,User2
可能具有2
到CompanyA
的访问级别Site1
和User3
可能具有1
到Site1
DepartmentX
的访问级别。如果User
可以访问某个实体(例如公司),则他们也可以访问该实体的成员。
我想创建一个视图,列出Department
的每个User
和每个Department
相关的访问级别。
这是我到目前为止所做的:
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
的一部分):
DeptId | UserId | DeptRightsLevel | SiteRightsLevel
-------+--------+-----------------+------------------
X | 2 | NULL | 2
X | 3 | 1 | NULL
Y | 2 | NULL | 2
如何将CompanyRightsLevel
合并到此表中,以便在表格中显示具有公司范围权限的用户?
如果我的数据库设置不清楚,请在评论中要求澄清。
答案 0 :(得分:0)
经过一小段头脑风暴后,我想出了这个:
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会强制将CompanySiteAccess
定义为自己的视图,但它应该可以正常工作。