0

次のテーブルがあります。

items id, principaluri, title
principals id, uri, name
members principal_id, member_id

アイテムの principaluri は、principals uri フィールドへの参照です。members テーブルは、プリンシパル間の関係を定義します。つまり、プリンシパルのメンバーは、principal_id のプリンシパルのアイテムにアクセスできます。プリンシパルのすべてのアイテムを取得するための選択はどのように見えますか?

メンバーシップのプリンシパルを取得するには

SELECT p.* 
FROM principals p
LEFT JOIN members m ON m.principal_id = p.id
WHERE p.id = m.principal_id and p.uri = 'myuri'

しかし今、リストからすべてのアイテムを取得する必要があります。

- - アップデート - -

プリンシパルテーブルには、次のようなレコードもあります

20, 'principals/admin', 'main account'
21, 'principals/admin/read', 'read access'
22, 'principals/admin/write', 'write access'
30, 'principals/test', 'main account'
31, 'principals/test/read', 'read access'
32, 'principals/test/write', 'write access'

メンバー テーブルは次のようになります。

21,30
22,30

これは、ユーザー テストが管理者ユーザーの項目への読み取りおよび書き込みアクセス権を持っていることを意味します。

しかし、items テーブルには次のようなエントリがあります。

100, 'principals/admin', 'Foo'
101, 'principals/admin', 'Bar'
4

1 に答える 1

1

これはネストされたクエリを使用しますが、それは仕事をしているようです:

SELECT i.*, mainp.uri mainuri, mp.memberuri, mp.linkuri access
FROM items i
LEFT OUTER JOIN principals mainp
   ON mainp.uri = i.principaluri
LEFT OUTER JOIN 
  (SELECT memberp.uri memberuri, linkp.uri linkuri
     FROM principals memberp
      INNER JOIN members m on memberp.id = m.member_id
      INNER JOIN principals linkp on m.principal_id = linkp.id) as mp
  ON mp.linkuri LIKE CONCAT(i.principaluri, '%')
WHERE mainp.uri = 'principals/test' OR mp.memberuri = 'principals/test'

フィドル:http ://www.sqlfiddle.com/#!2/7acc8 / 4

于 2013-01-15T16:36:06.277 に答える