"nur" ne MySQL-Abfrage
-
okay, ich hänge hier jetzt schon einige Zeit an einer Frage rum.. ich weiss das folgender Select logischerweise falsch ist. Aber so in der Art soll das Ergebnis aussehen.
SELECT ad_kampagnen.id id FROM ad_kampagnen, ad_klicks WHERE ad_kampagnen.id = ad_klicks.kampagne AND ad_klicks.user='$user' AND now() > max(ad_klicks.datum1) + INTERVAL ad_kampagnen.reloadsperre MINUTE
Ich habe 2 Tabellen. In einer Tabelle werden Werbekampagnen gespeichert. Und in einer weiteren die Klicks für die Kampagnen. Nun hab ich noch eine Reloadsperre die in der Kampagnen-Tabelle steht. Das funktioniert auch alles soweit ganz gut, ich kann für einen User und EINE kampagne überprüfen ob die Reloadsperre schon angelaufen ist.
Allerdings will ich jetzt eine Liste über alle Kampagnen erstellen, die sich NICHT in der Reloadsperre des users befinden.
- in ad_klicks.datum1 befindet sich die Zeit/Datum des letzten Klicks.
- ad_klicks.user ist die Userid (diese ist gegeben)
- ad_klicks.kampagne ist der Fremdschlüssel auf ad_kampagnen.id
- ad_kampagnen.reloadsperre enthält halt die Reloadsperre.Hat da vielleicht irgendwer ne Idee, oder vielleicht sowas in der Art schonmal gemacht?
-
Es kann doch auch Kampagnen geben, für die noch kein Eintrag in ad_klicks besteht, oder? LEFT JOIN sollte da helfen
Und was genau machst du hier?
max(ad_klicks.datum1) + INTERVAL ad_kampagnen.reloadsperre MINUTE
-
Hi,
stimmt, da hast du recht, daran hab ich noch gar nicht gedacht. Das "Problem" hätte ich dann wohl als nächstes bekommen. Wär ja aber lösbar.
ich habe mich oben ein bischen schlecht ausgedrückt, der SQL funkioniert nicht wie er da steht. Da ich natürlich nicht mal eben so ne Gruppenfunktion in der WHERE-Klausel benutzen kann.
Der Gedanke war halt der join zwischen den beiden Tabellen, und dann nur die Zeilen mit dem letzten Klick. Also zu jeder User/Kampagnen-Konstellation nur eine Zeile (nen group by wär das ja). Dann darein aber die Bedingung das die Reloadsperre nicht greifen darf.
Eben ist mir noch ne Idee gekommen wo ich das so schön ausformuliert habe. Es könnte mit nem Having gehen. Aber da ich eben grad noch ein paar kippen war werd ich das erst morgen versuchen
LEFT JOIN = outer join (oder wie? ich bin sonst immer mit oracle unterwegs und in mysql nochn bischen wackelig
)
thx schonmal
-
Ich weiß jetzt nicht so ganz, ob ich dich richtig verstanden habe und so ganz aus dem Kopf ist das natürlich nicht ganz so einfach, aber versuch es mal so:
SELECT ad_kampagnen.id FROM ad_kampagnen LEFT JOIN ad_klicks ON (ad_kampagnen.id = ad_klicks.kampagne AND ad_klicks.user='$user') GROUP BY ad_kampagnen.id WHERE now() > (max(ad_klicks.datum1) + INTERVAL ad_kampagnen.reloadsperre MINUTE) OR ad_klicks.datum1 IS NULL
Die Syntax deiner Reloadsperre habe ich zwar nicht so ganz begriffen, aber ich denke das bekommst du auch selber in den Griff
-
SELECT ad_kampagnen.id, max(ad_klicks.datum1) + INTERVAL ad_kampagnen.reloadsperre MINUTE reload FROM ad_kampagnen LEFT JOIN ad_klicks ON (ad_kampagnen.id = ad_klicks.kampagne AND ad_klicks.user='$user') GROUP BY ad_kampagnen.id HAVING now() > reload OR ad_klicks.datum1 IS NULL
So sieht das ganz gut aus
Kann es nur leider erst heute abend testen, bin grad auffa Arbeit.
Die Syntax ist eigentlich ganz einfach, auf das höchste Datum wird die zeit aus der spalte reloadsperre addiert, und dann das ganze mit der aktuellen systemzeit abgeglichen.
In der Where-Klausel KANN es nicht stehen, wegen der gruppenfunktion, war gestern nachmittag nur irgendwie, wie'n brett vorm kopp *g*SELECT id FROM ad_kampagnen a, ad_klicks b where a(+) = b
das geht in mysql nicht? naja ich kann ja heute abend testen wenn ich wieder @ home bin