2016-11-25 73 views
0

我有如下表:MySQL的三重連接查詢

users table 
user_id user_email user_name 
    1  [email protected]  a 
    2  [email protected]  b 
    3  [email protected]  c 

    bookmarks table 
bookmark_id user_id  bookmark_url 
    1   1  http://aaa.com 
    2   3  http://bbb.com 
    3   3  http://ccc.com 
    4   3  http://ddd.com 

    comments table 
comment_id user_id  content 
    1   2   'hello' 
    2   2   'hello2' 

我想是這樣的:

user_id user_email user_name bookmarksCount commentsCount 
    1  [email protected]  a   1    0 
    2  [email protected]  b   0    2 
    3  [email protected]  c   3    0 

從以上,每個xxx_id是自動遞增的序列號。

我想要得到以上結果,我必須加入這3個表。但是,如果在書籤和評論表中沒有匹配user_id,則它們不能加入。但是如果沒有匹配,我必須得到結果0

即使沒有匹配列,是否可以連接這些表以獲得結果?

+0

難以處理連接(即使是左連接),因爲您希望在同一查詢中有兩個單獨的計數,因此有效地實現了兩個單獨的聚合函數。如下建議的單獨查詢/子查詢是一個體面的解決方案 – ADyson

回答

3

你可以使用相關子查詢:

select u.*, 
     (select count(*) from bookmarks bm where bm.user_id = u.user_id 
     ) as cnt_bookmarks, 
     (select count(*) from comments c where c.user_id = u.user_id 
     ) as cnt_comments 
from users u; 

如果試圖做到這一點使用join,你將有問題的,因爲你會產生書籤和註釋爲每個用戶的笛卡爾乘積。另外,在連接之後進行聚合很可能會導致性能問題,因爲聚合的數據將大於必要的數據。

對於此查詢,bookmarks(user_id)comments(user_id)上的索引應提供非常好的性能。