2011-09-15 82 views
3

我想從以下查詢所需的結果,但它似乎沒有工作...MySQL查詢多個LEFT聯接問題

SELECT DISTINCT 
u.user_name as user_name, 
u.total_points as total_points, 
u.user_id as user_id, 
COUNT(a.id) as user_total_articles_published, 
COUNT(r.id) as user_total_replies_published, 
COUNT(v.id) as user_total_votes_done 
FROM users as u 
LEFT JOIN articles as a ON u.user_id=a.user_id 
LEFT JOIN replies as r ON u.user_id=r.user_id 
LEFT JOIN votes as v ON u.user_id=v.user_id 
GROUP BY u.user_id 
ORDER BY u.total_points DESC 
LIMIT 10 

如果我刪除最後2 LEFT JOIN的查詢將正常工作。 ..其他2什麼錯了?我是否必須使用其他方法才能正常工作?

感謝

+2

定義'不起作用'。 :) – GolezTrol

+1

什麼是錯誤? –

+0

它不給我想要的結果...我的意思是,user_total_articles_published返回一個更大的數字比正確的一個,當我添加其他2個左連接...所以一定有一些錯誤的查詢.. – fxuser

回答

7

我認爲「不工作」你的意思是,查詢返回太多記錄?這是因爲聯合的組合。您返回每篇文章記錄的每個回覆,以便數字相乘。您可以通過在COUNT中使用DISTINCT來解決此問題。這樣一來,你算的唯一ID的,所以你指望每篇文章只有一次:

COUNT(distinct a.id) as user_total_articles_published, 
COUNT(distinct r.id) as user_total_replies_published, 
COUNT(distinct v.id) as user_total_votes_done 

[編輯]

一個可能更快的解決方案,省去了DISTINCT和GROUP BY的需要:

SELECT 
    u.user_name as user_name, 
    u.total_points as total_points, 
    u.user_id as user_id, 
    (SELECT COUNT(a.id) FROM articles a 
    WHERE a.user_id = u.user_id) as user_total_articles_published, 
    (SELECT COUNT(r.id) FROM replies r 
    WHERE r.user_id = u.user_id) as user_total_replies_published, 
    (SELECT COUNT(v.id) FROM votes v 
    WHERE v.user_id = u.user_id) as user_total_votes_done 
FROM users as u 
ORDER BY u.total_points DESC 
LIMIT 10 
+0

這就是正確的!謝謝...順便說一句,我已經添加了獨特的頂部,但我並不知道我不得不重新添加它在每個COUNT()...那是我學到的東西..謝謝 – fxuser

+0

這是個壞主意,你的臨時表可以變得非常大。它將包括所有記錄回覆和投票表的產品在分組之前。 – varela

+0

頂部的獨特值只能在結果中獲得不同的值。計數中的不同是僅計算不同的值而不是總的行數。它們有不同的含義,如果需要可以一起使用。 – GolezTrol