Axel Richter: MySQL: Count über zwei Tables

Beitrag lesen

Hallo,

offensichtlich meinst du den fall, daß es keine direkte 1:n beziehung gibt. (master:detail über mehrere keys)

Nein. Ich meine den Fall, der in [pref:t=76241&m=439108] beschrieben wurde.

mit left/right join wird die eine tabelle gemäß der where bedingung komplett gelesen, während die andere gemäß der on bedingung verknüpft wird, wobei fehlende verknüpfungen mit null ergänzt werden.

Nein. Es wird eine Datensatzmenge mit Feldern beider Tabellen gebildet, in der alle Datensätze der einen Tabelle enthalten sind. Felder aus der anderen Tabelle werden dann und so oft mit den entsprechenden Inhalten in die Datensatzmenge einverknüpft, wie die Datensätze dieser Felder der ON-Klausel entsprechen. Ist das nicht der Fall, ist der Wert dieser Felder in der Datensatzmenge NULL.  Diese so entstandene Datensatzmenge wird dann entsprechend der WHERE-Klausel gefiltert.

also:

select count(t1.autor) as t1autor, count(t2.autor) as t2autor, t1.autor
from t1 left join t2 on t1.autor = t2.autor and t1.artikel = t2.artikel
group by t1.autor

ergibt ein 3 spaltiges resultset mit je einer zeile pro autor, wobei in den beiden anderen spalten die anzahl der sätze aus der 1. und 2. tabelle steht.

Nein.
Das angegebene Beispiel ist:

Inhalt der Tabelle Threads:
id=1      autor=1
id=2      autor=1
id=3      autor=3
id=4      autor=2

Inhalt der Tabelle Posts:
id=1      autor=2
id=2      autor=2
id=3      autor=1
id=4      autor=2

Dein

SELECT Threads.autor AS Threads_autor, Posts.autor AS Posts_autor
FROM Threads LEFT JOIN Posts ON Threads.autor = Posts.autor;

ergibt:
Threads_autor   Posts_autor
1               1
1               1
3
2               2
2               2
2               2

Lässt man das nun zählen

SELECT Threads.autor, Count(Threads.autor) AS Threads_autor, Count(Posts.autor) AS Posts_autor
FROM Threads LEFT JOIN Posts ON Threads.autor = Posts.autor
GROUP BY Threads.autor;

ergibt das:
autor  Threads_autor  Posts_autor
1      2              2
2      3              3
3      1              0

Meine Lösung

SELECT autor, Count(*) AS Anzahl
FROM (SELECT autor FROM Threads UNION ALL SELECT autor FROM Posts) AS ThreadsPosts
GROUP BY autor;

ergibt:
autor   Anzahl
1       3
2       4
3       1

Der Ausgangsposter wollte in [pref:t=76241&m=439108]:

Autor 1 = 3 Beiträge
Autor 2 = 4 Beiträge
Autor 3 = 1 Beitrag

viele Grüße

Axel