2011-10-15 78 views
2

我有一個左連接到一個表,要算從它的列由父表的列分組後:MySQL的左連接數

SELECT * , COUNT(list.id) AS listcount, COUNT(uploads.id) AS uploadcount 
FROM members 
LEFT JOIN lists ON members.id= list.mid 
LEFT JOIN uploads ON members.id= uploads.mid 
GROUP BY members.id 

假設用戶可以有列表或上傳基於用戶的類型。那麼上面的查詢就夠用了嗎?如果不是爲什麼?

或者我必須使用此查詢嗎?

SELECT * , l.listcount, u.uploadcount 
FROM members 
LEFT JOIN (select count(lists.id) as listscount,mid from lists group by mid) as l 
                   on l.mid = m.id 
LEFT JOIN (select count(uploads.id) as uploadscount 
          ,mid from uploads group by mid) as u on u.mid = m.id 
GROUP BY members.id 

或相關的子查詢?

SELECT *, 
     (select count(lists.id) as listscount from lists as l where l.mid = m.id 
     group by mid) as listcount 
     (select count(uploads.id) from uploads as u where u.mid = m.id 
     group by mid) as uploadscount 
FROM members 
GROUP BY members.id 

哪個是最好的解決方案?

+0

夠好,夠用了麼?你有沒有得到理想的結果,並在合理的時間內得到它們?那麼是的,否則不。 – Marcus

+0

總是推薦使用* EXPLAIN * http://dev.mysql.com/doc/refman/5.1/de/explain.html – aurora

回答

1

成員的別名m在查詢2和3中缺失,否則它們應該給出相同的數字。

查詢2(固定)將執行得最快。

查詢1是在於它會給出一個較高數目爲uploads不同,如果每個member多個lists的箱子。加入lists之後,會員也會有多行,這會增加uploads的計數。所以查詢1可能是錯誤的

另外,NULL的值是而不是。該manual informs

COUNT(表達式)

返回expr非NULL值的SELECT語句檢索的行 數的計數。結果是一個BIGINT值。

+0

來分析一個查詢。現在另一個問題,假設用戶可以同時擁有列表和上傳。現在是第一個查詢好嗎? – Venu

+0

@VenuGopalT:是的。 'list'和'uploads'在所有三個查詢中都是獨立的。現在,如果您在查詢1中將'LEFT JOIN上傳到列表.mid = uploads.mid',那麼情況就會不同:只會在有列表的情況下上傳。 –

+0

但我得到第一個查詢錯誤計數。 – Venu