yo,
bin wieder da, ich zocke gelegentlich gerne mal im internet...
Als Ergebnis brauche ich p.id, p.domain wobei "2 | domain2.de " als Ergebnis rauskommen sollen.
ok, dann können wir schon mal die kompletten joins weglassen, da du eh nur die daten von der tabelle partner haben willst und der rest sind aggregatfunktionen.
Es sollen die IDs ausgegeben werden, wo für die Bannerimpressionen (typ==1)$ der Status bezahlt ist (status==1).
ja, das ist kein problem, legen wir los. ich versuche das ein wenig im erzählstil zu schreiben. das erste was wir brauchen ist die tabelle mit den partner.
SELECT p.id, p.domain
FROM partners p
ok, das war einfach ;-) der zweite schritt besteht darin, die partner durch deine bedingungen einzuschränken, ohnen einen join zu bilden. dies machen wir mit einer korrelierten unterabfrage.
SELECT p.id, p.domain
FROM partners p
WHERE p.id IN
(SELECT r.partner_id
FROM p_rechnung r
WHERE p.id = r.partner_id
AND r.status = '1'
AND r.typ = '1'
)
so, die richtigen partner sollten nun gefunden sein. der dritte schritt besteht darin, die aggregat-funktionen einzubinden.
SELECT p.id, p.domain,
(SELECT COUNT(*) FROM p_rechnung r2 WHERE p.id = r2.partner_id) AS Anzahl,
(SELECT SUM(r3.anzahl) FROM p_rechnung r3 WHERE p.id = r3.partner_id) AS Summe_Rechnungen,
(SELECT SUM(v.views) FROM p_view v WHERE p.id = v.partner_id) AS Summe_Views
FROM partners p
WHERE IN
(SELECT r.partner_id
FROM p_rechnung r
WHERE p.id = r.partner_id
AND r.status = '1'
AND r.typ = '1'
)
die abfrage wird erst ab mysql 4.1+ funktionieren, weil erst ab dieser version unterabfragen unterstützt werden. den sinn der bedinung in der having klausel habe ich noch nicht ganz verstanden. wenn die noch eingebracht werden soll, dann sag noch mal, wofür sie fachlich steht, am besten immer mit beispielen.
Du kannst die NULL Werte bei den Aggregat-funktionen noch durch eine Funktion abfangen, falls es keine einträge in den entsprechenden tabellen gibt. aber das sollte dann auch kein problem mehr sein.
Ilja