2013-03-03 201 views
3

首先,我甚至不確定LEFT JOIN是否是做我想做的最好的方法,因此會盡力解釋。如果沒有匹配,則使用默認值執行LEFT JOIN

我有2個表 - 一個包含網站列表,另一個包含角色列表。用戶可能只有一個角色,但他們可能具有與站點一樣多的角色。

表 '網站'

site_id | site_name | site_domain 
--------------------------------------- 
1  | Site A  | sitea.com 
2  | Site B  | siteb.com 

表 '角色'

site_id | user_id | role_id 
--------------------------------- 
1  | 1  | 1 
1  | 2  | 1 
2  | 2  | 2 

正如我上面的例子中,用戶1有一個站點只有一個角色,但用戶2在兩個不同的網站上有兩個角色。

我想要做的事情,它可能只是一個星期天的夜晚不會直接思考的事情,是要列出網站列表以及每個用戶的角色 - 如果該網站沒有角色對於用戶,則返回NULL(或0)。

應該如何產生的輸出的兩個例子:

用戶1

site_id | site_name | site_domain | role_id 
---------------------------------------------- 
1  | Site A | sitea.com | 1 
2  | Site B | siteb.com | NULL 

用戶2

site_id | site_name | site_domain | role_id 
---------------------------------------------- 
1  | Site A | sitea.com | 1 
2  | Site B | siteb.com | 2 

查詢我的時刻低於然而, ,第二個網站沒有出現,因爲用戶沒有定義角色(即像上面那樣,但是對於我們呃1第二個網站B將不會列出)。我知道,我只是失去了一些東西,但不能認爲它今晚:O(

SELECT site_id, site_name, site_domain, role_id 
FROM `sites` 
LEFT JOIN `roles` 
ON sites.site_id=roles.site_id 
WHERE roles.user_id='1' 
+0

你能舉一個你想要的結果的例子嗎? – 2013-03-03 20:10:57

+0

這些例子顯示了它應該如何出現,使之更清晰一些:o) – MrJ 2013-03-03 20:12:41

回答

3

你需要做的是開始,結合所有站點和用戶表,則在信息中roles表連接。 :

select s.site_id, s.site_name, s.site_domain, u.user_id, r.role_id 
from (select distinct user_id from roles) u cross join 
    sites s left outer join 
    roles r 
    on s.site_id = r.site_id and 
     u.user_id = r.user_id 

如果你有一個用戶表,然後你可以用表替換第一個子查詢

對於在單個用戶參與網站,你可以把一個恆定的子查詢:

select s.site_id, s.site_name, s.site_domain, u.user_id, r.role_id 
from (select 1 as user_id) u cross join 
    sites s left outer join 
    roles r 
    on s.site_id = r.site_id and 
     u.user_id = r.user_id 

或者where子句:where u.user_id = 1

+0

謝謝 - 這完美地工作:o) - 在 – MrJ 2013-03-03 20:35:48

+0

之前從未做過'CROSS JOIN'當你使用逗號加入時'CROSS JOIN'是相同的:) – Fuv 2013-03-03 20:37:33

+0

只是缺少最後的地方u.user_id ='1'xP – 2013-03-03 20:38:48

相關問題