wegus schrieb:
Das sind keine Bedingungen sondern virtuelle Spalten einer DB!
...
Schon klar, aber der Inhalt einer solchen virtuellen Spalte wird mit einer Bedingung definiert. Auf diesem Umweg, kann man eine (oder mehrere) zusätzliche Sortierebenen einführen.
Konkret geht es bei mir um eine Tabelle in der Termine für Rabattaktionen gespeichert sind, die ich gleich mit der SELECT Abfrage richtig sortieren möchte, was gar nicht so einfach ist.
Für manche Aktionen gibt es einen Starttermin und einen Endtermin.
andere Aktionen haben je zwei Start- und Endtermine.
Die Termine können sich auf unterschiedliche Art überschneiden.
Vereinfacht kann man von 5 Feldern ausgehen aktion (TEXT), start1 (DATE), ende1 (DATE), start2(DATE), ende2(DATE).
Sortiert werden soll nach den start Feldern, wobei start1 nur dann berücksichtig werden soll, wenn ende1 >=now().
Dass nur Datensätze ausgewählt werden, bei denen (ende1>=now() AND ende2>=now()) gilt ist eh klar.
Mein bisheriger Ansatz sieht so aus, funktioniert aber noch nicht ganz wunschgemäß:
Code:
$sql = qq/SELECT
IF (ende1>=now(),1,2) AS 'bed',
aktion, # TEXT
start1, # DATE
ende1, # DATE
start2, # DATE
, # DATE
[...]
FROM aktionen, beschreibungen.$language
WHERE [...]
AND (ende1>= now() OR ende2 >=now()) # min ein Termin noch nicht abgelaufen
ORDER BY bed,start1,start2
/
Ein Problem gibt es bei Datensätzen für die gilt (ende1<now()) UND (start2<start1) von anderen Datensätzen mit (ende1>=now().
Die werden nämlich dann aufgrund der Bedingung nach hinten geschoben und somit nicht korrekt einsortiert.
Ich hoffe, ich hab das jetzt so beschrieben, dass man es versteht
.
Wenn Du (oder jemand anders) einen besseren Lösungsansatz wissen, bitte posten.