我有以下表格:
items id, principaluri, title
principals id, uri, name
members principal_id, member_id
项目principuri是对principles uri字段的引用。成员表定义了主体之间的关系,意味着主体的成员可以访问principal_id中的主体项目。 select看起来如何获得委托人的所有项目?
为了获得会员资格,我要做
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'
但是现在我需要从列表中获取所有项目。
-更新-
在principals表中,我还记录如下
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
这意味着用户测试对管理员用户的项目具有读写权限。
但是在项目表中,我有如下条目:
100, 'principals/admin', 'Foo'
101, 'principals/admin', 'Bar'
最佳答案
这使用了嵌套查询,但似乎可以完成此工作:
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
关于php - 联接超过三个表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14340143/