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

时间:2012-05-31 18:26:52

标签: mysql sql

我正在设计一个关系数据库,其中用户对其各个部分具有某些访问级别。可以将这些部分称为CompanySiteDepartmentCompany由一个或多个Site组成,每个Site由一个或多个Department组成。 User与每个实体之间存在多对多关系,每个关系都具有访问级别。

例如,User1可能具有3CompanyA的访问级别,User2可能具有2CompanyA的访问级别Site1User3可能具有1Site1 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合并到此表中,以便在表格中显示具有公司范围权限的用户?

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

1 个答案:

答案 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定义为自己的视图,但它应该可以正常工作。