0

ユーザーがさまざまな部分への特定のアクセスレベルを持つリレーショナルデータベースを設計しています。これらの部分Companyを 、Site、 と呼びましょうDepartment。ACompanyは 1 つ以上の で構成されSite、それぞれSiteは 1 つ以上の で構成されますDepartment。これらの各エンティティ間には多対多のUser関係があり、各関係にはアクセス レベルがあります。

たとえば、へUser1のアクセス レベル、 へのアクセス レベル、へのアクセス3レベルなどがCompanyAあります。が会社などの特定のエンティティにアクセスできる場合、そのエンティティのメンバーにもアクセスできると見なされます。User22CompanyASite1User31Site1DepartmentXUser

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 に答える