MySQL Beiträge nach Datum sortiert ausgeben. Nicht so einfach wie es sich anhört :)

chris4712

Erfahrenes Mitglied
Hey mal wieder!

Ich habe in einer Tabelle verschiedene Events. Diese haben ein Start- Datum und ein End-Datum.
Das End- Datum kann auch leer sein, wenn es ein Endlos Event ist.

Ich möchte nun die Ausgabe so machen dass:
a) Alle Events angezeigt werden die Schon vorbei sind
b) Danach alle Events die grade noch aktiv sind
c) Alle Events die irgendwann noch kommen

Ich komm irgendwie nicht dahinter wie ich dies am besten anstelle :rolleyes:

Hoffe Ihr habt weniger Kopfschmerzen wie ich
 
SQL:
-- a)
WHERE end_date < SYSDATE()

-- b)
WHERE start_date < SYSDATE() AND (end_date IS NULL OR end_date > SYSDATE())

-- c)
WHERE start_date > SYSDATE()
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

probier mal etwas in der Art:
SQL:
…
ORDER BY end_date IS NOT NULL AND end_date < NOW() DESC,
         start_date <= NOW() DESC

Grüße,
Matthias
 
Zuletzt bearbeitet von einem Moderator:
genauer bitte.
Wenn du alle nehmen willst, die eines dieser Kriterien erfüllen, kannst du die Kritieren gleich ganz weglassen. Denn jeder Event ist entweder vorbei, aktiv oder in Zukunft.

Brauchst du ein Flag für spätere Auswertungen? Dann schau mal in der MySQL-Doku inter IF() nach.

Oder gehts wirklich nur um die Reihenfolge?

Da kommen mir ganz Spontan 3 möglichkeiten in den Sinn. Es gibt sicher noch weitere. Also nur Mut zum pröbeln
SQL:
-- Variante 1: IF() im ORDER BY-Teil
SELECT *,	
FROM myTable
ORDER BY 
	IF(
		end_date < SYSDATE(), 
		1, 
		IF(
			start_date < SYSDATE() AND (end_date IS NULL OR end_date > SYSDATE()), 
			2, 
			IF(
				start_date > SYSDATE(), 
				3, 
				NULL
			)
		)
	),
	start_date,
	end_date;

-- Variante 2: UNION
SELECT 1 AS sort, * FROM myTable WHERE end_date < SYSDATE()
UNION SELECT 2 AS sort, * FROM myTable WHERE start_date < SYSDATE() AND (end_date IS NULL OR end_date > SYSDATE())
UNION SELECT 3 AS sort, * FROM myTable WHERE start_date > SYSDATE()
ORDER BY
	sort,
	start_date, 
	end_date;
	
-- Variante 3: Flag im SELECT-Teil
SELECT
	IF(end_date < SYSDATE(), 1, 0) AS past,
	IF(start_date < SYSDATE() AND (end_date IS NULL OR end_date > SYSDATE()), 2, 0) AS active,
	IF(start_date > SYSDATE(), 3, 0) AS future,
	*
FROM
	myTable
ORDER BY 
	(past+active+future)
	start_date, 
	end_date;
 
Zuletzt bearbeitet von einem Moderator:
SQL:
…
ORDER BY end_date IS NOT NULL AND end_date < NOW() DESC,
         start_date <= NOW() DESC

Funktioniert dem ersten Anschein nach.

@Yaslaw: Geht wirklich nur um eine sortierte (also ordentliche) Ausgabe.
Der User soll die Events beliebig erstellen können. Kann also sein dass er heute ein Event erstellt was erst in drei Monaten aktiv ist, und morgen ein Event erstellt was schon aktiv ist.
So soll einfach nur die Übersicht gegeben werden.

Erstmal Danke bis hierhin!
 
Zuletzt bearbeitet von einem Moderator:
Da ist meines definit zu kompliziert... ich sollte nicht mehr um Mitternacht coden. Kommt nix Sinnvolles mehr raus *g*
 
Zurück