0

我正在设计一个关系数据库,其中用户对其各个部分具有一定的访问级别。让我们将这些部分称为CompanySiteDepartment。ACompany由一个或多个组成Site,每个Site由一个或多个组成Department。这些实体之间存在多对多的关系User,并且每个关系都有一个访问级别。

例如,可能User1具有对 的访问级别3,可能对's具有访问级别,并且可能对's具有访问级别。如果 a可以访问某个实体(例如公司),则假定他们也可以访问该实体的成员。CompanyAUser22CompanyASite1User31Site1DepartmentXUser

我想创建一个视图,列出每个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合并到此表中,以便在表中显示具有公司范围权限的用户?

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

4

1 回答 1

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

于 2012-05-31T18:47:15.880 回答