Zum Inhalt springen

SQL bzw. MySQL - kniffliges ORDER BY Problem


200Pulsman

Empfohlene Beiträge

Hallo Leute,

ich habe ein ORDER BY Problem:

Ich habe eine Tabelle mit Datensätzen die verschiedene Datums-Felder (Typ date, also z.B. 2006-12-31 o. 0000-00-00) enthalten. Nämlich.

- datum_termin = Datum, an dem der Datensatz durch den Benutzer spätestens bearbeitet werden muss

- datum_wiedervorlage = Datum, an dem der Benutzer den Datensatz zur Bearbeitung vorgelegt bekommt. Darüberhinaus gibt es noch weitere Datumsfelder.

Dabei können die Datensätze gefüllt mit einem Datum, also z.B. 2006-12-31, oder auch nicht, also NULL (0000-00-00) sein.

Ich möchte jetzt beim SELECT folgende Sortierung erreichen:

Alle Datensätze deren datum_termin bereits abgelaufen ist, sollen immer ganz vorne stehen, danach kommt der Rest. Als zweites Sortierkriterium die Datensätze mit datum_wiedervorlage nach dem gleichen Schema. Das sieht dann also so aus.

datum_termin datum_wiedervorlage

2006-11-06 2006-12-31

2006-11-06 2007-11-23

2006-11-31 0000-00-00

2006-12-01 0000-00-00

2007-01-01 0000-00-00

2007-06-05 0000-00-00

0000-00-00 0000-00-00

0000-00-00 0000-00-00

0000-00-00 0000-00-00

0000-00-00 0000-00-00

Ich will also eine aufsteigende Sortierung erreichen.

Wenn ich ORDER BY datum_termin ASC sortiere, sind aber immer alle leeren (0000-00-00) Datensätze vorne, was ich ja nicht will. Sortiere ich ORDER BY datum_termin DESC sind zwar alle leeren Datensätze hinten, dann stimmt aber die Sortierung der gefüllten nicht mehr, nämlich daß der am längsten abgelaufene Termin ganz oben steht, sondern umgekehr. Wie mache ich das jetzt?

Danke für Eure Hilfe!

Link zu diesem Kommentar
Auf anderen Seiten teilen

als workaround allenfalls:

select datum_termin, datum_wiedervorlage from tab where datum_termin IS NOT NULL [ORDER BY datum_termin ASC]

UNION

select datum_termin, datum_wiedervorlage from tab where datum_termin IS NULL

sprich, datensätze mit NULLen separat von jenen mit nicht-NULLen behandeln. ist allerdings ungetestet.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich möchte jetzt beim SELECT folgende Sortierung erreichen:

Alle Datensätze deren datum_termin bereits abgelaufen ist, sollen immer ganz vorne stehen, danach kommt der Rest. Als zweites Sortierkriterium die Datensätze mit datum_wiedervorlage nach dem gleichen Schema. Das sieht dann also so aus.

...

Ich will also eine aufsteigende Sortierung erreichen.



SELECT datum_termin, datum_wiedervorlage, 

  case when datum_termin < CURRENT_DATE() then 0

    else 1

  end case as Index_termin,

  case when datum_wiedervorlage < CURRENT_DATE() then 0

    else 1

  end case as Index_wiedervorlage

FROM Tabelle

ORDER BY Index_termin asc, datum_termin asc, 

Index_wiedervorlage asc, datum_wiedervorlage asc


Du prüfst im Select ob der Termin abgelaufen ist. Wenn ja hat dein jeweiliges Indexfeld 0, wenn nicht 1. Anschliessend kannst du danach dann auch sortieren.

Das oben ist jetzt aus dem Kopf, aber sowas hab ich so schonmal gemacht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also zuerstmal ist die order nicht ascending (aufsteigend), sondern descending (absteigend) wenn du mit vorne als erstes meinst

also sortierung desc asc ist sowieso standard und braucht nicht benannt zu werden

dann sollte das einfach so gehen

select felder from tabelle order by wichtigstesfeld desc,2twichtigstesfeld desc,drittwichtigstesfeld desc;

fertig.

Null Felder sind dabei als letztes aufgelistet.

Kannst du aber auch besser umgehen wenn du dem feld einen standardwert zuweist default 0000-00-00

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also zuerstmal ist die order nicht ascending (aufsteigend), sondern descending (absteigend) wenn du mit vorne als erstes meinst

2006-11-31 0000-00-00

2006-12-01 0000-00-00

2007-01-01 0000-00-00

Ist eine aufsteigende Sortierung (also asc). Und wie du ja sagst ist desc Standard (kann also angegeben werden, muss aber nicht).

Und außerdem sollten die Null-Werte (Null hat den Vorteil, dass Null als leeres Datum, also kein Datum, erkannt wird von eigentlich allen Clients. Eigene Werte, wie 0000-00-00, würde ein Client nicht erkennen als leer) vor diesen Werten sein und dabei aber bei weiteren Feldern (wenn gefüllt) der Sortierung folgen. Mit einem einfachen Order by ist das so eben nicht zu erreichen.

EDIT:

Ups, asc ist standard. Aber angegeben (bei mir), weil er es ja mischen könnte und man so auf jeden Fall leichter den ÜBerblick behält.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jo Danke Leute.

Hat mir sehr weitergeholfen. In der Zwischenzeit habe ich mir Hilfsfelder gebaut und entsprechend befüllt und anhand dieser dann eine Sortierung durchgeführt. Ist war nicht ganz so elegant, hat aber funktioniert. Mal schauen wie sich das von der Geschwindigkeit auswirkt. Es ist nämlich zu erwarten, dass irgendwann mehr als 50.000 Datensätze vorhanden sein werden.

:cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...