mysql: CASE in WHERE ?
Paule
- mysql
0 dedlfix0 Paule0 woodfighter0 Paule0 Paule0 woodfighter0 Paule
Hallo,
ich bräuchte eine CASE Fallunterscheidung in einer WHERE Klausel.
Kennt mysql das?
Konkret:
Ich habe eine Datumsspalte und eine Wiederholungsspalte, es geht ium Erinnerungsmails, die versendet werden sollen.
Die Wiederholungsspalte kennt
Ich würde gerne bereits über die Query selektieren, ob eine Erinnerungsmail versendet wird oder nicht, das bedeutet, ich müßte in der WHERE-Klausel das aktuelle Datum mit der Datumsspalte (ggf. ergänzt um die Wiederholungsspalte) vergleichen.
Kriegt man das in einer Query hin?
Paul
Tach!
ich bräuchte eine CASE Fallunterscheidung in einer WHERE Klausel.
Kennt mysql das?
Ja. MySQL hat auch eine gute Dokumentation. Für deinen Fall wäre das der Abschnitt Functions and Operators und da weiter bei Control Flow.
Kriegt man das in einer Query hin?
Vermutlich. Bist du schon auf Probleme gestoßen?
dedlfix.
Hi dedlfix,
Ja. MySQL hat auch eine gute Dokumentation. Für deinen Fall wäre das der Abschnitt Functions and Operators und da weiter bei Control Flow.
Ja, ungefährt dort hatte ich auch schon geguckt.
Vermutlich. Bist du schon auf Probleme gestoßen?
Und ob. :-)
...
WHERE
(CASE
WHEN t1.wiederholung = '0' THEN t1.datum = curdate() ...
...
Hier fehlt mir einfach noch irgend etwas.
Ich will ja sagen: Wenn Spalte t1.wiederholung '0' ist, dann gilt die Bedingung "wenn t1.datum dem heutigen Datum entspricht. Das sage ich aber nicht. Und ich weiß nicht, was dort fehlt.
Paul
Tach,
... WHERE (CASE WHEN t1.wiederholung = '0' THEN t1.datum = curdate() ... ...
Ich will ja sagen: Wenn Spalte t1.wiederholung '0' ist, dann gilt die Bedingung "wenn t1.datum dem heutigen Datum entspricht. Das sage ich aber nicht. Und ich weiß nicht, was dort fehlt.
Wenn zwei Bedingungen greifen sollen, kannst du sie mit AND verknüpfen, CASE unterhalb von WHERE ergibt eher keinen großen Sinn, weil du als Rückgabe im wesentlichen eh nur Booleans erzeugen kannst.
WHERE
t1.wiederholung = '0' AND t1.datum = curdate() OR
…
mfg
Woodfighter
Wenn zwei Bedingungen greifen sollen, kannst du sie mit AND verknüpfen, CASE unterhalb von WHERE ergibt eher keinen großen Sinn, weil du als Rückgabe im wesentlichen eh nur Booleans erzeugen kannst.
WHERE t1.wiederholung = '0' AND t1.datum = curdate() OR …
Das stimmt. Ok, da hätte ich drauf kommen können. Danke für die Hilfe
Jetzt noch die Datumsfunktionen hinbekommen, könnte sein, dass ich da nochmal Eure Hilfe bemühen muß.
Paul
Jetzt noch die Datumsfunktionen hinbekommen, könnte sein, dass ich da nochmal Eure Hilfe bemühen muß.
Da haben wir es schon.
Ich bin jetzt so weit:
WHERE
... AND
(t1.wiederholung = '0' AND t1.datum = curdate())
OR (t1.wiederholung = 'tag' AND t1.datum >= curdate())
OR ( t1.wiederholung = '1tag' AND (t1.datum >= curdate() AND t1.datum <= CURDATE() + INTERVAL 1 DAY) )
OR ( t1.wiederholung = '2tag' AND (t1.datum >= curdate() AND t1.datum <= CURDATE() + INTERVAL 2 DAY) )
OR ( t1.wiederholung = '3tag' AND (t1.datum >= curdate() AND t1.datum <= CURDATE() + INTERVAL 3 DAY) )
Aber wie mache ich sql klar, dass ich wöchentlich erinnern möchte?
OR ( t1. wiederholung = 'woche' AND (t1.datum ...
Und dann? Gibt es so etwas wie eine "weekly" Funktion oder kann man sie basteln?
Paul
Tach,
Aber wie mache ich sql klar, dass ich wöchentlich erinnern möchte?
dafür musst du entweder abspeichern, wann zuletzt erinnert wurde, dafür sorgen dass die wöchentlichen Erinnerungen immer am selben Wochentag stattfinden oder ein Intervall zu einem festen Tag, der zum Datensatz gehört (z.B. Timestamp des Eintragens oder falls es um Termine geht, den Termin selber), haben.
mfg
Woodfighter
Tach,
Aber wie mache ich sql klar, dass ich wöchentlich erinnern möchte?
dafür musst du entweder abspeichern, wann zuletzt erinnert wurde, dafür sorgen dass die wöchentlichen Erinnerungen immer am selben Wochentag stattfinden oder ein Intervall zu einem festen Tag, der zum Datensatz gehört (z.B. Timestamp des Eintragens oder falls es um Termine geht, den Termin selber), haben.
Hi Woodfighter,
hab ich mir auch gedacht und habe die Tabelle umgestrickt. Ich habe jetzt den Termin der nächsten Ausführung, den ich jeweils nach Ausführung dann um das jeweilige Intervall updaten muß. Erstelldatum habe ich auch gespeichert, das hat aber eher philosophischen Wert. Tag der Erstausführung habe ich auch gespeichert, aber auch das hat (nach der ersten Auführung dann nur noch philosophischen Wert). Im Gegenzug wird natürlich die SELECT Query sehr einfach, mit dem Nachteil einer neuen Update Query versteht sich.
Danke für Deine (und dedlfix) Hilfe.
Ich denke, ab hier komme ich klar.
Paul