MySQL | Sortierung/IFNULL?

27apricot

Erfahrenes Mitglied
Hallo,

ich hab' eine MySQL-Tabelle erstellt mit den Konzertdaten eines Clubs. Diese lese ich, sortiert nach Datum (Feld: 'datum1'), mittels PHP aus.
Für den Fall, dass sich ein Datum erst kurz vor dem Konzert ändert, habe ich ein Feld 'datum2', das ansonsten leer bleibt. In meinem PHP-Script kann ich so das alte Datum durchgestrichen anzeigen und das neue fett und rot.
Nun möchte ich das Konzert aber an der neuen Stelle im Programm einordnen lassen. Ich nehme an, dass ich das mit IFNULL machen kann, krieg' das aber nicht hin. So sieht es bis jetzt aus:

SELECT datum1, datum2, IFNULL(datum2,datum1) as reihenfolge, titel
FROM konzerte
WHERE @reihenfolge LIKE '$auswahl'
ORDER BY @reihenfolge ASC;";

($auswahl ist eine PHP-Variable für den Monat nach dem prinzip jjjj-mm-__)

So wird jetzt gar kein Konzert ausgegeben und wenn ich WHERE/LIKE weglasse, sind sie unsortiert.

Vielen Dank schon mal,
27apricot
 
Zuletzt bearbeitet:
Hallo,


versuchs mal hiermit:
PHP:
"SELECT datum1, 
   datum2, 
   IF(datum2 IS NULL,datum1, datum2) as reihenfolge, 
   titel
FROM konzerte
WHERE datum1 LIKE '".$auswahl."'
   OR datum2 LIKE '".$auswahl."'
ORDER BY reihenfolge ASC";

cu Bloddy
 
Hallo,

vielen dank, aber das funktioniert leider auch nicht. Hier wird gar nix mehr nach Datum sortiert, sondern nur noch nach den IDs, also - wenn ich das richtig verstehe - default.

27apricot
 
Hallo 27apricot ,

leere Datumsfelder enthalten in MySQL normalerweise den Wert '0000-00-00', also nicht NULL. Außerdem sind Datums-Abfragen mit LIKE meist problematisch, wenn man einen Datums-Bereich auswählen will, dann besser mit >= und <=.
Außerdem funktioniert das mit der @-Benutzervariablen soviel ich weiß nicht so, wie Du das bei @reihenfolge gemacht hast. @-Variablen müssen mit := gesetzt werden - und im WHERE-Teil darf man sie dann glaube ich auch nicht verwenden. Die AS-Feld-Aliase darf man zwar bei ORDER BY verwenden, aber auch nur dann, wenn man nicht zusätzlich irgend welche anderen Funktionen im ORDER BY benutzt.

Folgendes könnte helfen:
Code:
SELECT
 datum1,
 datum2,
 IF(datum2 = '0000-00-00', datum1, datum2) AS reihenfolge,
 titel
FROM
 konzerte
WHERE
     IF(datum2 = '0000-00-00', datum1, datum2) >= '$datumvon'
 AND IF(datum2 = '0000-00-00', datum1, datum2) <= '$datumbis'
ORDER BY
 reihenfolge
Grüße,
Martin
 
Zuletzt bearbeitet:
@ Reshalb

woher weißt du, dass er den Datentyp DATE/ DATETIME zum Abspeichern des Datums verwendet? :D Es könnte genausogut sein, dass er lediglich einen TIMESTAMP speichert - ich weiß es nicht.

Es wäre sicherlich von Vorteil, wenn zunächst die Datentypen der beiden Felder bekannt gegeben würden.

mfg Bloddy
 
Zuletzt bearbeitet:
Hallo,

'datum2' war bei mir ein VARCHAR(10), weil ich bis vor ein paar Stunden nicht damit klar kam, dass es den default '0000-00-00' als '30' ausgelesen hat. Mittlerweile weiß ich, wie das zu verhindern ist, war eher ein PHP-Problem.
Leider hat auch die zweite Lösung bei mir nicht so richtig funktioniert. Hab' das ganze jetzt ganz anders gelöst. Bei kurzfristiger Datumsänderung wird 'datum1' geändert. Will man, dass das alte Datum als 'gelöscht' mit angezeigt wird, so muss es in 'datum2' geschrieben werden. Ein wenig um die Ecke gedacht, aber es geht.

Danke euch trotzdem vielmals,
27apricot
 
Zurück