SQL = ORDER BY wird ignoriert ... warum?
Benjamin
- datenbank
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 |
+----+------------+---+
SELECT id,
end
AS datey, 'E' FROM union_dev WHEREend
> NOW()
UNION
SELECT
CASE
WHENstr
>prs
THEN id
WHENstr
<prs
THEN id
WHENstr
IS NULL ANDprs
IS NULL THEN id
END,
CASE
WHENstr
>prs
THENstr
WHENstr
<prs
THENprs
WHENstr
IS NULL ANDprs
IS NULL THEN '0000-00-00'
END AS datey,
CASE
WHENstr
>prs
THEN 'S'
WHENstr
<prs
THEN 'P'
WHENstr
IS NULL ANDprs
IS NULL THEN 'N'
END
FROM union_dev
WHEREend
< NOW() ORend
IS NULL
ORDER BY datey DESC;
Hilft das?
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)
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