Benjamin: SQL = ORDER BY wird ignoriert ... warum?

Tag

Ich versuche eine SQL abfrage zu schreiben die ein teil aufsteigend und ein andern teil absteigend sortiert :( Aber irgendwie ignoriert er die Order By ... einer ne idee warum ?

  
(SELECT id, `end` AS datey, 'E' FROM union_dev WHERE `end` > NOW() ORDER BY datey ASC)  
UNION  
(SELECT  
  CASE  
    WHEN `str` > `prs` THEN id  
    WHEN `str` < `prs` THEN id  
    WHEN `str` IS NULL AND `prs` IS NULL THEN id  
  END,  
  CASE  
    WHEN `str` > `prs` THEN `str`  
    WHEN `str` < `prs` THEN `prs`  
    WHEN `str` IS NULL AND `prs` IS NULL THEN '0000-00-00'  
  END AS datey,  
    CASE  
    WHEN `str` > `prs` THEN 'S'  
    WHEN `str` < `prs` THEN 'P'  
    WHEN `str` IS NULL AND `prs` IS NULL THEN 'N'  
  END  
FROM union_dev  
WHERE `end` < NOW() OR `end` IS NULL  
ORDER BY datey DESC);  

eigentlich soll das rauskommen ...
+----+------------+---+
| id | datey      | E |
+----+------------+---+
| a  | 2007-07-28 | E |
| c  | 2007-09-30 | E |
| b  | 2007-10-20 | E |
| e  | 2007-12-01 | S |
| d  | 2007-10-19 | P |
| f  | 2007-04-19 | P |
| g  | 2007-02-01 | S |
| i  | 0000-00-00 | N |
| h  | 0000-00-00 | N |
+----+------------+---+

alle mit e sollen aufsteigend nach datey sortiert werden und alle andern absteigend

aber er sortiert nur nach ID :( dann kommt das raus
+----+------------+---+
| id | datey      | E |
+----+------------+---+
| a  | 2007-07-28 | E |
| b  | 2007-10-20 | E |
| c  | 2007-09-30 | E |
| d  | 2007-10-19 | P |
| e  | 2007-12-01 | S |
| f  | 2007-04-19 | P |
| g  | 2007-02-01 | S |
| h  | 0000-00-00 | N |
| i  | 0000-00-00 | N |
+----+------------+---+

  1. SELECT id, end AS datey, 'E' FROM union_dev WHERE end > NOW()
    UNION
    SELECT
      CASE
        WHEN str > prs THEN id
        WHEN str < prs THEN id
        WHEN str IS NULL AND prs IS NULL THEN id
      END,
      CASE
        WHEN str > prs THEN str
        WHEN str < prs THEN prs
        WHEN str IS NULL AND prs IS NULL THEN '0000-00-00'
      END AS datey,
        CASE
        WHEN str > prs THEN 'S'
        WHEN str < prs THEN 'P'
        WHEN str IS NULL AND prs IS NULL THEN 'N'
      END
    FROM union_dev
    WHERE end < NOW() OR end IS NULL
    ORDER BY datey DESC;

      
    Hilft das?
    
    1. HA :) THX erstmal an alle

      -.- lesen hilft :/ hab einfach in der mysql doku das LIMIT überlesen man muss ein LIMIT angeben wenn man für jeden SELECT ein order will

      MEIN FINAL QUELLTEXT:

        
      (SELECT  
                    a.ID,  
                    a.PREISVERLEIHUNG,  
                    a.NAME,  
                    a.START,  
                    DATE_FORMAT(a.ENDE,'%d.%m.%Y') as `ENDE`,  
                    UNIX_TIMESTAMP(a.ENDE) as `TS_ENDE`,  
                    UNIX_TIMESTAMP(a.DATUM) as `TS`,  
                    a.Ende AS datey,  
                    'E' AS opy  
      from `bz_award` as a, `bz_award_bereich` as ab  
      WHERE 1 AND a.ENDE > NOW()  
             AND a.ENDE IS NOT NULL  
             AND ab.AWARD_ID=a.ID  
             AND ab.BEREICH_ID=2  
             AND a.PROBE=0  
      ORDER BY datey ASC LIMIT 999)  
      UNION  
      (SELECT  
                    a.ID,  
                    a.PREISVERLEIHUNG,  
                    a.NAME,  
                    a.START,  
                    DATE_FORMAT(a.ENDE,'%d.%m.%Y') as `ENDE`,  
                    UNIX_TIMESTAMP(a.ENDE) as `TS_ENDE`,  
                    UNIX_TIMESTAMP(a.DATUM) as `TS`,  
                 CASE  
                    WHEN a.START > a.PREISVERLEIHUNG OR (a.PREISVERLEIHUNG IS NULL AND a.START IS NOT NULL) THEN a.START  
                    WHEN a.START < a.PREISVERLEIHUNG OR (a.START IS NULL AND a.PREISVERLEIHUNG IS NOT NULL) THEN a.PREISVERLEIHUNG  
                    WHEN a.START IS NULL AND a.PREISVERLEIHUNG IS NULL THEN '0000-00-00'  
                END AS datey,  
                CASE  
                    WHEN a.START > a.PREISVERLEIHUNG OR (a.PREISVERLEIHUNG IS NULL AND a.START IS NOT NULL) THEN 'S'  
                    WHEN a.START < a.PREISVERLEIHUNG OR (a.START IS NULL AND a.PREISVERLEIHUNG IS NOT NULL) THEN 'P'  
                    WHEN a.START IS NULL AND a.PREISVERLEIHUNG IS NULL THEN 'N'  
                END AS opy  
      from `bz_award` as a, `bz_award_bereich` as ab  
      WHERE (a.ENDE < NOW() OR a.ENDE IS NULL)  
            AND ab.AWARD_ID=a.ID  
            AND ab.BEREICH_ID=2  
            AND a.PROBE=0  
      ORDER BY datey DESC LIMIT 999)  
      
      
  2. Hi,

    Ich versuche eine SQL abfrage zu schreiben die ein teil aufsteigend und ein andern teil absteigend sortiert :( Aber irgendwie ignoriert er die Order By ... einer ne idee warum ?

    wenn Du Dir von Deinem DBMS - welches immer das sein mag - den Ausführungsplan ansiehst, wirst Du vermutlich feststellen, dass die Sortierungen sehr wohl ausgeführt werden. Und zwar direkt vor einer anderen Sortierung, die für UNION notwendig ist. Du möchtest wohl eher UNION ALL einsetzen.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes