Benjamin: Mehere Datumsfelder miteinander Vergleichen

Hi

Ich sitze schon seit ein paar stunden an diesen problem :(
Ich habe Diese Mysql Datenbankeinträge und will sie sortiert ausgeben

Id| Ende   |  Start  |   Preis

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)

Id| Datum  | op

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?

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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 ?

      1. 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

        1. 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 :/

          1. 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