2016-08-02 11 views
2

ich vier Tische habenMysql wählen 4 Tabellen mit 3 Zählung

users 
ID display_name 
1 Name1 
2 Name2 
3 Name3

Ein Benutzer Bücher zu Tisch Bücher hinzufügen

books 
book_id AddedByuserID 
1  1 
2  1 
3  2 
4  3

Auch kann ein Benutzer E-Books zu Tisch ebooks hinzufügen

ebooks 
ebook_id AddedByuserID 
1  1 
2  2 
3  2 
4  3

Jetzt kann ein Benutzer Bücher nur zu seiner Sammlung hinzufügen (nicht Ebooks)

collection 
userID book_id 
1  1 
1  2 
1  3

Ich brauche eine Ausgabe wie folgt:

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

Dies ist, was bekam:

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 

Der Benutzer display_name wird korrekt und auch die Sammlung Anzahl angezeigt, aber die beiden anderen Zählungen zeigen 1. Wenn ich DISTINCT entferne, sagt die Sammlung Count 86, und die zwei anderen Zählungen zeigen nichts.

Ich versuche zu verstehen, LINKE Join und lesen Tutorials, aber ich bin im Moment fest.

+0

Und was ist mit 'Name3' passiert? –

+0

Ich aktualisierte die Ausgabe. – grusl83

Antwort

2

würde ich Correlated Subqueries vorschlagen:

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; 

Ich weiß nicht, warum Sie den dritten Benutzer Ausfiltern werden, jedoch.

+0

Ich habe vergessen, den dritten Benutzer auszugeben. Ich werde jetzt deinen Code ausprobieren. – grusl83

+0

Danke Ihr Code funktioniert gut! Gibt es eine Möglichkeit, SORT BY books_in_collection? – grusl83

+0

Ja, für diese Art von Ergebnis ist es immer besser Unterabfragen zu verwenden. – iSaumya