2013-10-28 93 views
2

我有3個表,我需要他們的組合來查看所有列合併(MySQL)。MySQL JOIN的3個表

1st。表poi_ACL_permissions

ID  permKey   permName 
|1 |access_site   |Access Site 
|2 |access_admin   |Access Admin System 
|3 |publish_articles  |Publish Articles 
|4 |publish_events  |Publish Events 
|5 |install_modules  |Install Modules 
|6 |post_comments   |Post Comments 
|7 |access_premium_content|Access Premium Content 
|8 |limited_admin   |Limited Admin 

2nd。表是poi_ACL_roles

ID roleName 
| 1|Administrators 
| 2|All Users 
| 3|Authors 
| 4|Premium Members 

3rd。表poi_ACL_role_perms

ID roleID permID value  addDate 
| 16|  1|  2|  1|2009-03-02 17:13:21 
| 17|  1|  7|  1|2009-03-02 17:13:21 
| 18|  1|  1|  1|2009-03-02 17:13:21 
| 19|  1|  5|  1|2009-03-02 17:13:21 
| 20|  1|  8|  1|2009-03-02 17:13:21 
| 21|  1|  6|  1|2009-03-02 17:13:21 
| 22|  1|  3|  1|2009-03-02 17:13:21 
| 23|  1|  4|  1|2009-03-02 17:13:21 
| 24|  2|  1|  1|2009-03-02 17:13:31 
| 25|  3|  7|  1|2009-03-02 17:13:38 
| 26|  3|  8|  1|2009-03-02 17:13:38 
| 27|  3|  6|  1|2009-03-02 17:13:38 
| 28|  3|  3|  1|2009-03-02 17:13:38 
| 29|  3|  4|  1|2009-03-02 17:13:38 
| 30|  4|  7|  1|2009-03-02 17:13:42 
| 31|  4|  6|  1|2009-03-02 17:13:42 

我有這個疑問:

SELECT [roleName], [roleID], [value], [permID] AS RPID, [permKey], [permName], [poi_ACL_permissions].[ID] AS PID 
FROM [poi_ACL_permissions] 
LEFT OUTER JOIN [poi_ACL_role_perms] 
ON [poi_ACL_permissions].[ID] = [poi_ACL_role_perms].[permID] 
LEFT OUTER JOIN [poi_ACL_roles] 
ON [poi_ACL_role_perms].[roleID] = [poi_ACL_roles].[ID]   
ORDER BY [roleID], [permID] ASC 

,事實上,給我我需要什麼...(幾乎))的結果是陣列的所有角色和它的權限。但是,我需要的也是NULL權限。

現在:

0 Administrators 1 1 1 access_site  Access Site  1 
1 Administrators 1 1 2 access_admin Access Admin System  2 
2 Administrators 1 1 3 publish_articles Publish Articles 3 
3 Administrators 1 1 4 publish_events Publish Events 4 
4 Administrators 1 1 5 install_modules  Install Modules  5 
5 Administrators 1 1 6 post_comments Post Comments 6 
6 Administrators 1 1 7 access_premium_content Access Premium Content 7 
7 Administrators 1 1 8 limited_admin Limited Admin 8 
8 All Users  2 1 1 access_site  Access Site  1 
9 Authors   3 1 3 publish_articles Publish Articles 3 
10 Authors   3 1 4 publish_events Publish Events 4 
11 Authors   3 1 6 post_comments Post Comments 6 
12 Authors   3 1 7 access_premium_content Access Premium Content 7 
13 Authors   3 1 8 limited_admin Limited Admin 8 
14 Premium Memb. 4 1 6 post_comments Post Comments 6 
15 Premium Memb. 4 1 7 access_premium_content Access Premium Content 7 

但是,如所有用戶應該是:

0 All Users 2 1 1 access_site 
1 All Users 2 0 2 access_admin 
2 All Users 2 0 3 publish_articles 
3 All Users 2 0 4 publish_events 
4 All Users 2 0 5 install_modules 
5 All Users 2 0 6 post_comments 
6 All Users 2 0 7 access_premium_content 
7 All Users 2 0 8 limited_admin 

等等

能否請你幫我與SQL?

+0

是的,但我想這樣做,在MySQL(「莫名其妙」):) –

+0

這被標記爲MySQL,但查詢看起來像SQL服務器 –

+0

沒有,它是MySQL,但是我我正在使用Dibi(http://dibiphp.com) –

回答

3

使用之前你rolepermission表之間的CROSS JOIN左加入到role_permission表:

SELECT 
    r.roleName, 
    r.ID AS roleID, 
    COALESCE(rp.value, 0) AS value, 
    p.ID AS permissionID, 
    p.permKey, 
    p.permName 
FROM poi_ACL_permissions p 
CROSS JOIN poi_ACL_roles r 
LEFT OUTER JOIN poi_ACL_role_perms rp 
    ON p.ID = rp.permID 
    AND r.ID = rp.roleID 
ORDER BY r.ID, p.ID 

另外,還要注意使用表別名(rprp),這有助於查詢的可讀性。

SQL Fiddle

+0

有趣的事情,我即將添加完全相同的答案(即使使用相同的別名):P只有我使用過的東西'coalesce' –

+1

@MostyMostacho是的, coalesce' ...可能更好的是在可能的情況下保持ANSI標準。 –