PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SQL] User die zwischen X und Y geworben wurden und Z Aktionen mitgemacht haben.



Gremlin
11.07.2009, 18:28
Wo ist der Fehler:




SELECT mitglieder.werber, COUNT(mitglieder.id) AS menge, COUNT(teilnahmen.id) AS teilnahmen FROM
mitglieder
LEFT JOIN teilnahmen ON teilnahmen.uid=mitglieder.id AND teilnahmen.zeit >= '.$start.' AND teilnahmen.zeit <= '.$ende.'
WHERE mitglieder.status="aktiv" AND mitglieder.werber > 0 AND mitglieder.registrierung >= '.$start.' AND mitglieder.registrierung <= '.$ende.'
GROUP BY teilnahmen.uid, mitglieder.werber
HAVING teilnahmen >= '.$min.'
ORDER BY menge DESC LIMIT 10
Ich möchte zu jedem Werber die Anzahl der Refs die zwischen $start und $ende geworben wurden. Es zählen jedoch nur Refs die zwischen $start und $ende an min. 2 Aktionen teilgenommen haben.

Der o.g. Query liefert mir:

werber = 1
menge = 2

Dabei hat werber 1 nur 1 Ref geworben :der:.

tampulin
11.07.2009, 19:49

Gremlin
11.07.2009, 20:52
Also wenn ich das ändere z.B. auf AS teilnahmen2 ändert es nichts an der Sache. Werden trotzdem noch 2 Refs angezeigt.

mitglieder.status ist im mom enum('wartend', 'aktiv', 'gesperrt')

breaker
11.07.2009, 23:31
SELECT
mitglieder.werber,
COUNT(mitglieder.id) AS menge,
COUNT(teilnahmen.id) AS teilnahmen
FROM mitglieder
LEFT JOIN teilnahmen
ON (teilnahmen.uid = mitglieder.id)
AND (teilnahmen.zeit >= '.$start.')
AND (teilnahmen.zeit <= '.$ende.')
WHERE mitglieder.status = "aktiv"
AND mitglieder.werber > 0
AND mitglieder.registrierung >= '.$start.'
AND mitglieder.registrierung <= '.$ende.'
GROUP BY teilnahmen.uid, mitglieder.werber
HAVING teilnahmen >= '.$min.'
ORDER BY menge DESC LIMIT 10 Zeile 5: Als was soll Tabelle "mitglieder" ausgelesen werden?
Zeile 6: Als was die Tabelle "teilnahmen"?
Zeile 11: Ein "<>" ist in der MySQL-Syntax günstiger als die PHP-Operatoren ">"
Zeile 12: Auch PHP-Operatoren
Zeile 13: Auch PHP-Operatoren
Zeile 16: "LIMIT 0,10" ist richtiger

Ist die Kollation beider Tabellen gleich?
Wenn nicht, gibts ein mixed-Error ;)

Gremlin
11.07.2009, 23:59
Noch immer das gleiche ;-)

Gremlin
12.07.2009, 00:20
Richtige Lösung:



SELECT mitglieder.werber, COUNT(DISTINCT mitglieder.id) AS menge, COUNT(teilnahmen.id) AS teilnahmen FROM
mitglieder
LEFT JOIN teilnahmen ON teilnahmen.uid=mitglieder.id AND teilnahmen.zeit >= '.$start.' AND teilnahmen.zeit <= '.$ende.'
WHERE mitglieder.status="aktiv" AND mitglieder.werber > 0 AND mitglieder.registrierung >= '.$start.' AND mitglieder.registrierung <= '.$ende.'
GROUP BY teilnahmen.uid, mitglieder.werber
HAVING teilnahmen >= '.$min.'
ORDER BY menge DESC LIMIT 10


Einfach DISTINCT nutzen bei mitglieder.uid um doppelte zu filtern.