Zur Navigation

Reihen folge mit ORDER BY

1 andehrl

hallo jörg, ich würde gerne 2 fragen gleichzeitig stellen.

1.: wenn ich verschiedenen datenfeldern im ergebnis eine reihenfolge zuweisen möchte wobei ein feld aufsteigend und ein anderes absteigend aufgelistet werden soll muss ich dann hinter jedem feld "ASC" bzw. "DESC" hinterlegen oder sind alle aufgelisteten felder vor "ASC" bzw. "DESC" der ordnungsfunktion unterworfen?

als bspl. muss ich

ORDER BY Eingabe.datum ASC, Eingabe.zeit ASC, Eingabe.ladeflaechenlaenge DESC

oder wird auf diese art datum und zeit aufsteigend gelistet?

ORDER BY Eingabe.datum, Eingabe.zeit ASC, Eingabe.ladeflaechenlaenge DESC


2.: wenn ich bei einer datenbankabfrage als ergebnis sowohl die von mir gesuchten werte als auch felder die mit "NULL" belegt sind angezeigt bekomme, kann ich dann die reihenfolge der ergebnisliste so festlegen, das erst die gesuchten werte aufsteigend ausgeben werden und danach die datensätze in denen das entprechende feld mit "NULL" belegt ist.

könnte ich also statt 0,0,0,1,1,2,2,3,4,5,6 mit ORDER BY die reihenfolge 1,1,2,2,3,4,5,6,0,0,0 erhalten

30.09.2010 19:07 | geändert: 30.09.2010 19:50

2 Jörg Kruse

Zitat von andehrl
1.: wenn ich verschiedenen datenfeldern im ergebnis eine reihenfolge zuweisen möchte wobei ein feld aufsteigend und ein anderes absteigend aufgelistet werden soll muss ich dann hinter jedem feld "ASC" bzw. "DESC" hinterlegen oder sind alle aufgelisteten felder vor "ASC" bzw. "DESC" der ordnungsfunktion unterworfen?

als bspl. muss ich

ORDER BY Eingabe.datum ASC, Eingabe.zeit ASC, Eingabe.ladeflaechenlaenge DESC

oder wird auf diese art datum und zeit aufsteigend gelistet?
ORDER BY Eingabe.datum, Eingabe.zeit ASC, Eingabe.ladeflaechenlaenge DESC

DESC musst du bei jedem zu sortierenden Feld notieren, ASC kannst du auch weglassen; der zweite Fall würde also auch in deinem Sinne funktionieren, aber aus einem anderen als von dir angenommenen Grund ;)

2.: wenn ich bei einer datenbankabfrage als ergebnis sowohl die von mir gesuchten werte als auch felder die mit "NULL" belegt sind angezeigt bekomme, kann ich dann die reihenfolge der ergebnisliste so festlegen, das erst die gesuchten werte aufsteigend ausgeben werden und danach die datensätze in denen das entprechende feld mit "NULL" belegt ist.

könnte ich also statt 0,0,0,1,1,2,2,3,4,5,6 mit ORDER BY die reihenfolge 1,1,2,2,3,4,5,6,0,0,0 erhalten

Gibt es einen höchsten Wert? dann könnte man mit einer IFNULL() Konstruktion dem Feld (hier `foo`) einen höchsten Wert zuweisen und nach diesem (hier `bar`) sortieren:

SELECT IFNULL(foo, 1000) AS bar ORDER BY bar

Siehe auch:

http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html

30.09.2010 20:36 | geändert: 30.09.2010 20:38

3 andehrl

Gibt es einen höchsten Wert? dann könnte man mit einer IFNULL() Konstruktion dem Feld (hier `foo`) einen höchsten Wert zuweisen und nach diesem (hier `bar`) sortieren:

SELECT IFNULL(foo, 1000) AS bar ORDER BY bar

Siehe auch:

http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html[/quote]

nein es gibt leider keinen höchsten wert. ein benutzer gibt einen wert in der datenbank ein und ein anderer nutzer kann dann nach für ihn passenden werten suchen. ich könnte höchstens davon ausgehen, dass eine laderaumlänge nicht 10m o.ä. übersteigt.

30.09.2010 20:47

4 Jörg Kruse

Du kannst statt 1000 auch 1000000 nehmen.

Aber so ist es vielleicht sauberer:

SELECT IF(IS NULL(foo), 1, 0) AS bar ORDER BY bar, foo

... dann benötigt man keinen angenommen Höchstwert

30.09.2010 20:54

5 andehrl

also wenn ich es richtig verstehe wäre "foo" in meinem beispiel das feld "ladeflaechenlaenge" ich versteh dann aber nicht was "bar" wäre?

30.09.2010 21:05

6 Jörg Kruse

Der Alias `bar` ist hier ein Hilfsparameter, mit dem man nach NOT NULL und NULL sortieren kann

30.09.2010 21:14

7 andehrl

dann würde meine ORDER BY angabe so ausschaun?

ORDER BY Eingabe.datum, Eingabe.zeit, SELECT IF(IS NULL(Eingabe.ladeflaechenlaenge), 1, 0) AS bar ORDER BY bar, Eingabe.ladeflaechenlaenge

30.09.2010 21:18

8 Jörg Kruse

Der SELECT Teil gehört natürlich nach vorne

SELECT Eingabe.irgendwas, /* etc. */, IF(IS NULL(Eingabe.ladeflaechenlaenge), 1, 0) AS bar
FROM Eingabe
WHERE /* Bedingungen */
ORDER BY Eingabe.datum, Eingabe.zeit, bar, Eingabe.ladeflaechenlaenge

30.09.2010 21:26

9 andehrl

füge ich dann bei einem formatierten feld wie zb:

TIME_FORMAT(Eingabe.zeit, '%H:%i') AS zeit_formatiert

den code auf diese art ein?

SELECT Eingabe.irgendwas, /* etc. */, IF(IS NULL(TIME_FORMAT(Eingabe.zeit, '%H:%i') AS zeit_formatiert), 1, 0) AS bar
FROM Eingabe
WHERE /* Bedingungen */
ORDER BY Eingabe.datum, Eingabe.zeit, bar, Eingabe.ladeflaechenlaenge

30.09.2010 22:03

10 Jörg Kruse

Nein, das sind zwei Aliase: von `zeit_formatiert` willst du den Inhalt abfragen, `bar` benötigst du zum sortieren weiter hinten in der Query

SELECT Eingabe.irgendwas, /* etc. */, TIME_FORMAT(Eingabe.zeit, '%H:%i') AS zeit_formatiert, IF(IS NULL(Eingabe.zeit), 1, 0) AS bar

30.09.2010 22:10