Mehere Datumsfelder miteinander Vergleichen
Benjamin
- datenbank
0 wahsaga
Hi
Ich sitze schon seit ein paar stunden an diesen problem :(
Ich habe Diese Mysql Datenbankeinträge und will sie sortiert ausgeben
A |28.07.07| 01.03.07| Null
B |20.10.07| 16.04.07| Null
C |30.09.07| 18.04.07| Null
D |30.03.07| 01.01.07| 19.10.07
E |29.03.07| 01.12.07| 19.05.07
F |28.03.07| 01.02.07| 19.04.07
G |27.03.07| 01.02.07| 19.01.07
H | Null | Null| Null
I | Null | Null| Null
Die Regeln:
-ist 'Ende' größer als das aktuelle Datum sortiere Ende aufsteigend.
-ist 'Ende' kleiner als das aktuelle Datum gucke was größer ist 'start' oder 'preis'. Das Höchste sortiere dann absteigend
so sollte dann an ende etwar das Ergebnis aussehen
(op sagt was sortiert wurde E = Ende, S = Start, P = Preis, N = NULL)
A |28.07.07| E
C |30.09.07| E
B |20.10.07| E
E |01.12.07| S
D |19.10.07| P
F |19.04.07| P
G |01.02.07| S
H | Null | N
I | Null | N
Ich fummel die ganze zeit mit Union`s rum aber damit komm ich irgendwie nicht weiter hat einer von euch eine Idee?
hi,
Die Regeln:
-ist 'Ende' größer als das aktuelle Datum sortiere Ende aufsteigend.
-ist 'Ende' kleiner als das aktuelle Datum gucke was größer ist 'start' oder 'preis'. Das Höchste sortiere dann absteigend
Bastle dir ein entsprechendes Sortierkriterium mit Hilfe der Control Flow Functions zusammen.
gruß,
wahsaga
Bastle dir ein entsprechendes Sortierkriterium mit Hilfe der Control Flow Functions zusammen.
Ja aber irgendwie steh ich aufn schlauch :/
das hilft mir doch auch nicht weiter oder?
irgendwie klammer ich mich gerade an ORDER BY :/ das kann ich doch nicht bei Ablaufsteuerungsfunktionen benutzen oder ?
Hallo,
mithilfe der CONTROL FLOW Sachen erzeugst du ein neues "temporäres" Feld, nach wessen Alias du dann sortieren kannst.
Die Funktionen GREATEST(arg,arg,arg,...) hilft dir dabei den jeweils grössten Werte von [Ende], [Start] und [Preis] zu bekommen. Beispiel (ohne Gewehr)
SELECT
Id,
GREATEST(Ende, Start, Preis) AS Datum,
CASE Datum
WHEN Ende THEN 'E'
WHEN Start THEN 'S'
WHEN Preis THEN 'P'
ELSE 'U' -- for UNKNOWN
END AS Op
FROM DeineTabelle
ORDER BY Datum
Grüsse, Frank
jo danke erstmal ... haben mir geholfen eure Vorschläge :)
ich hab hier mal jetzt mein aktuellen stand:
SELECT id, `end` AS datey, 'E' FROM union_dev WHERE `end` > NOW() ORDER BY datey ASC;
(SELECT id, `str` AS datey, 'S' FROM union_dev WHERE `end` < NOW() AND `str` > `prs`)
UNION
(SELECT id, `prs` AS datey, 'P' FROM union_dev WHERE `end` < NOW() AND `str` < `prs`)
UNION
(SELECT id, '0000-00-00', 'N' FROM union_dev WHERE `end` IS NULL AND `str` IS NULL AND `prs` IS NULL)
ORDER BY datey DESC;
bis jetzt sind das noch 2 query daraus soll aber nur 1 werden :)
query nr1 gibt:
+----+------------+---+
| id | end | E |
+----+------------+---+
| a | 2007-07-28 | E |
| c | 2007-09-30 | E |
| b | 2007-10-20 | E |
+----+------------+---+
query nr2 gibt:
+----+------------+---+
| id | datey | S |
+----+------------+---+
| e | 2007-12-01 | S |
| d | 2007-10-19 | P |
| f | 2007-04-19 | P |
| g | 2007-02-01 | S |
| h | 0000-00-00 | N |
| i | 0000-00-00 | N |
+----+------------+---+
nun müssen die beiden sachen verbuden werden einer ne idee wie ? ich dachte daran ein Union dazwischen zu setzen ... aber irgentwie komm ich net weiter :/
yo,
nun müssen die beiden sachen verbuden werden einer ne idee wie ? ich dachte daran ein Union dazwischen zu setzen ... aber irgentwie komm ich net weiter :/
vergiss mal deine idee mit UNION und schau dir, wie wahsaga schon angeraten hat, insbesondere die CASE anweisung an. dort fügst du einfach die bedingungen der WHERE klausel aus deinen alten Unions ein, gibts dem ganzen einen alias namen und steuerst damit deine sortierung.
Ilja