2016-08-02 41 views
2

我有四個表Mysql的選擇與3計數

users 
ID display_name 
1 Name1 
2 Name2 
3 Name3

用戶可以添加圖書表書4桌

books 
book_id AddedByuserID 
1  1 
2  1 
3  2 
4  3

而且用戶可以添加電子書表電子書

ebooks 
ebook_id AddedByuserID 
1  1 
2  2 
3  2 
4  3

現在用戶只能將書籍添加到他的收藏中(不是電子書)

collection 
userID book_id 
1  1 
1  2 
1  3

我需要一個像這樣的輸出:

 
display_name books_added ebooks_added books_in_collection 
Name1   2   1    3 
Name2   1   2    2 
Name3   1   1    1

這是什麼讓:

SELECT users.*, COUNT(DISTINCT collection.book_id) AS books_in_collection, COUNT(DISTINCT books.AddedByuserID) AS books_added, COUNT(DISTINCT ebooks.AddedByuserID) AS ebooks_added 
FROM users LEFT JOIN collection ON users.ID = collection.userID 
LEFT JOIN books ON users.ID = books.AddedByuserID 
LEFT JOIN ebooks ON users.ID = ebooks.AddedByuserID 
GROUP BY users.ID 
ORDER BY display_name ASC 

用戶DISPLAY_NAME獲取顯示正確,也收集次數,但其他兩個計數顯示1. 如果我刪除DISTINCT,收集計數爲86,而其他兩個計數均不顯示。

我嘗試瞭解左連接和閱讀教程,但我現在卡住了。

+0

'Name3'發生了什麼? –

+0

我更新了輸出。 – grusl83

回答

2

我建議相關子查詢:

select u.*, 
     (select count(*) from collection c where u.id = c.userId) as books_in_collection, 
     (select count(*) from books b where u.id = b.AddedByUserId) as books_added, 
     (select count(*) from ebooks e where u.id = e.AddedByUserId) as ebooks_added 
from users u; 

我不知道爲什麼你過濾掉了第三個用戶,但是。

+0

我忘了輸出第三個用戶。我會嘗試你的代碼。 – grusl83

+0

謝謝你的代碼工作正常!有沒有什麼辦法可以排序books_in_collection? – grusl83

+0

是的,對於這種結果,最好使用子查詢。 – iSaumya