Count über mehrere Tabellen

maweg

Mitglied
Hallo

Ich habe 4 verschiedene Tabellen:

Tabelle 1: Usertabelle mit Informationen zu den Usern
Tabelle 2: Userid + Anderes
Tabelle 3: Userid + Anderes
Tabelle 4: Userid + Anderes

Nun möchte ich zu jedem User aus der Usertable die Anzahl der Zeilen mit der selben Userid in den anderen 3 Tabellen zählen und schlussendlich als Resultat sowas bekommen:

Userid --> Summe der Einträge (Anzahl Zeilen Tab. 1 + Anz. Zeilen Tab 2. + Anz. Zeilen Tab 3)
 
Mach am besten 3 Abfragen, 3 * Count(ID) und zähle das unter PHP zusammen. Eine andere Lösung kenne ich nicht...


MfG Radhad
 
Mit correlated Subselects müsste das so gehen:
PHP:
SELECT t1.userid,
 (SELECT COUNT * FROM tabelle2 t2 WHERE t1.userid=t2.userid)
+(SELECT COUNT * FROM tabelle3 t3 WHERE t1.userid=t3.userid)
+(SELECT COUNT * FROM tabelle4 t4 WHERE t1.userid=t4.userid) 
FROM tabelle1 t1
 
Original geschrieben von Radhad
Mach am besten 3 Abfragen, 3 * Count(ID) und zähle das unter PHP zusammen. Eine andere Lösung kenne ich nicht...
MfG Radhad

Das Problem ist, dass eben noch mehrere Tabellen hinzu kommen müssen und ich für Jeden User die Summe brauche.
 
Original geschrieben von Gorcky
Mit correlated Subselects müsste das so gehen:
PHP:
SELECT t1.userid,
 (SELECT COUNT * FROM tabelle2 t2 WHERE t1.userid=t2.userid)
+(SELECT COUNT * FROM tabelle3 t3 WHERE t1.userid=t3.userid)
+(SELECT COUNT * FROM tabelle4 t4 WHERE t1.userid=t4.userid) 
FROM tabelle1 t1

funktioniert nicht ;(
 
Dazu müsste man jetzt natürlich erst mal wissen, ob deine Datenbank ("schon") Subselects unterstützt...
mySQL tut dies erst ab Version 4.1

PS: COUNT * soll natürlich eigentlich COUNT(*) sein, da habe ich geschlampt.:-(
 
Original geschrieben von Gorcky
Dazu müsste man jetzt natürlich erst mal wissen, ob deine Datenbank ("schon") Subselects unterstützt...
mySQL tut dies erst ab Version 4.1

PS: COUNT * soll natürlich eigentlich COUNT(*) sein, da habe ich geschlampt.:-(

Das mit COUNT hab ich auch selbst bemerkt ;)
Ich benutze die Version 4.0.20 also hat sich das mal geklärt ;)

Ich habe mir nun folgenden Query gebastelt:

PHP:
SELECT u.Userid, 
count( DISTINCT fc.id ) +  count( DISTINCT f.id ) + count( DISTINCT m.id ) + count( DISTINCT pc.id ) + count( DISTINCT ug.id ) + count( DISTINCT ugb.id ) AS anzahl 
FROM users u
LEFT JOIN foto_comments fc ON u.Userid = fc.uid
LEFT JOIN fotoalbum f ON u.Userid = f.uid
LEFT JOIN messages m ON u.Userid = m.uid_send
LEFT JOIN pic_comments pc ON u.Userid = pc.uid
LEFT JOIN usergallery ug ON u.Userid = ug.uid
LEFT JOIN usergb ugb ON u.Userid = ugb.uid_send
GROUP BY u.Userid

Funktioniert auch. Das Problem ist nur, dass er gut 45 Sekunden dauert ^^

Mit Explain erhalte ich folgendes:

table type possible_keys key key_len ref rows Extra
u index NULL PRIMARY 4 NULL 58 Using index; Using temporary; Using filesort
fc ALL uid NULL NULL NULL 4
f ALL uid NULL NULL NULL 13
m ref uid_send uid_send 4 u.Userid 15
pc ref uid uid 4 u.Userid 19
ug ref uid uid 4 u.Userid 14
ugb ALL uid_send NULL NULL NULL 2

Und ich komme ehrlich gesagt nicht weiter.

In den einzelnen Tabellen hab ich uid resp. uid_send als Index gesetzt.
 
Zurück