2010-06-15 30 views
0

這是我目前的查詢 - 它沒有得到所需的結果。我希望它顯示所有的「資源」,即使它們沒有連接。加入3張桌子 - 做加入如何

SELECT * 
FROM (`user_permissions`) 
JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role` 
JOIN `user_resources` ON `user_resources`.`id` = `user_permissions`.`resource` 
WHERE `role` = '4' 

當我嘗試左連接或右連接仍然返回相同的結果。結果我得到的是:

id | role | resource | name 

5 | 4  |  2 | Changelog 

我想

id | role | resource | name 

5 | 4 | 2 | Changelog 
null | null | null | Resource2 
null | null | null | Resource3 

這可能嗎?

回答

3

查看您的查詢,roleuser_permissions的一部分,它是可能存在也可能不存在的連接之一。考慮更改where子句WHERE `role`= '4' OR `role` IS NULL,如果你想顯示這些空的記錄,以及...

而且,雖然這可以通過正確的完成加入,我相信如果你從user_resources選擇相反,它更可讀/理解,然後在其他桌子上加入。這來自您的問題描述聲明;你想要「顯示所有'資源',即使它們沒有連接」,這意味着你想從資源中選擇,然後加入任何連接(如果存在的話)。

2

在SQL你問

WHERE `role` = '4' 

,並且想要在rolenull的結果呢? null不是4,所以沒有這樣的結果。

1

第一條:您的Where子句將始終限制結果集。你有一個條件,要求角色是「4」 - 所以它不顯示任何結果,除非角色列中的結果爲「4」。

第二個:其中是「名稱」來自 - 因爲那是你想要出現的那個,所以你需要把那個列作爲你的基表,並且左邊加入另外兩個表。

假設 「名」 是從資源的到來,您的查詢應爲:

SELECT * 
FROM `user_resources` 
LEFT JOIN `user_permissions` ON `user_permissions`.`resource` = `user_resources`.`id` 
LEFT JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role` 
1

SELECT * FROM (user_permissions) JOIN user_groups ON user_groupsid = user_permissionsrole JOIN user_resources ON user_resourcesid = user_permissionsresource WHERE(role = '4' 或role爲空),你會從中得到查詢結果