加入三张桌子

时间:2013-01-15 14:43:07

标签: php mysql select join

我有以下表格:

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

项目principaluri是对主体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'

但现在我需要从列表中获取所有项目。

---更新---

在校长表中,我也有像

这样的记录
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

表示用户测试具有对admin用户项目的读写权限。

但是在项目表中我有以下条目:

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

1 个答案:

答案 0 :(得分: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