MySQL Sortierung

27o8

abgemeldet
2 Mai 2006
9.028
933
Folgende Tabelle habe ich:

id|wartezeit
1|0
2|3
3|0.5
4|2
5|0.01
Ich suche nun einen Query, mit dem ich die Datensätze nach wartezeit sortieren kann. Die kleinste Wartezeit soll als erstes angezeigt werden. Soweit ist das ja noch kein Problem. Allerdings möchte ich alle Spalten mit wartezeit = 0 nicht vorne, sondern ganz hinten anzeigen.

Wartezeit = 0 bedeutet so viel wie noch keine Daten vorhanden. In der Tabelle sind noch weitere Felder vorhanden, an denen ich erkennen kann ob schon Daten vorhanden sind (z.B. wenn teilnahmen > 0) allerdings kann ich ja auch nicht erst nach teilnahmen und dann nach wartezeit sortieren, denn dann wäre die Aktion 2 unter Umständen weiter vorne (weil sie mehr Teilnahmen hat) :roll:

Gibt es dort vllt. noch eine andere Möglichkeit?

Möchte das wenn möglich nicht in PHP "nachsortieren".
 
Code:
[FONT=Courier New]... [B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]IF[/COLOR][/B](wartezeit = 0, 999999999, wartezeit)[/FONT]
?
Kp, wie effizient das is, aber es müsste das tun, was du willst.

Ansonsten halt zwei Abfragen:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] *
[B][COLOR=#9932cc]FROM[/COLOR][/B] ...
[B][COLOR=#9932cc]WHERE[/COLOR][/B] wartezeit != 0
[B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] wartezeit [B][COLOR=#9932cc]ASC[/COLOR][/B]
[B][COLOR=#9932cc]UNION[/COLOR][/B]
[B][COLOR=#9932cc]SELECT[/COLOR][/B] *
[B][COLOR=#9932cc]FROM[/COLOR][/B][/FONT][FONT=Courier New] ...[/FONT][FONT=Courier New]
[B][COLOR=#9932cc]WHERE[/COLOR][/B] wartezeit = 0

[/FONT]
 
Code:
[FONT=Courier New]... [B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]IF[/COLOR][/B](wartezeit = 0, 999999999, wartezeit)[/FONT]
?
Kp, wie effizient das is, aber es müsste das tun, was du willst.
Das ist perfekt. Laut phpMyAdmin (die Abfrage dauerte 0.0019 sek). Und dazu wird das noch gecached :)
 
Ich fänd's so ja intuitiver:
Code:
... ORDER BY wartezeit = 0 ASC, wartezeit ASC
 
Ich fänd's so ja intuitiver:
Code:
... ORDER BY wartezeit = 0 ASC, wartezeit ASC
die Abfrage dauerte 0.0020 sek
:mrgreen: Natürlich nur bei einer Abfrage. Müsste man mal mit richtigem benchmark schauen welches schneller ist. Funktionieren tun aber beide.

Was hingegen nicht funzt ist das zweite von theHacker:
#1221 - Incorrect usage of UNION and ORDER BY

*edit*
Damit das funzt, einfach beide querys in klammern hauen. Das dauert aber ganze 0.0242 sek ^^
 
Was hingegen nicht funzt ist das zweite von theHacker:
[...]
*edit*
Damit das funzt, einfach beide querys in klammern hauen. Das dauert aber ganze 0.0242 sek ^^


Aber Achtung:
Ein UNION entfernt doppelte Sätze ( wirkt also wie DISTINCT ).
Es kann daher passieren, dass die Ergebnismenge nicht vollständig ist.
Es kann auch passieren, dass das Datenbanksystem die Ergebnismenge umsortiert ( um doppelte Sätze zu erkennen ) und demnach das ORDER BY der ersten Teilquery nicht mehr wirksam ist.
 
Ich machs der Übersicht halber immer so, dass ich mir einen "sort-parameter" mitselecte.
PHP:
select IF(wartezeit=0,-1,wartezeit) as sort_wartezeit, wartezeit from table ...... order by sort_wartezeit desc, wartezeit asc
 
das ist zwar grundsätzlich der richtige Weg, würde in dem konkreten Fall aber schiefgehen

PHP:
select IF(wartezeit=0,-1,wartezeit) as sort_wartezeit, wartezeit 
from table ...... 
order by sort_wartezeit desc, wartezeit asc

weil in sort_wartezeit entweder -1 oder die konkrete Wartezeit drinsteht und bei ORDER BY sort_wartezeit desc die höchste Wartezeit zuerst kommt
( und das ... wartezeit asc nicht mehr relevant ist ).

Möglich wäre allerdings:

PHP:
select IF(wartezeit=0,-1,+1) as sort_wartezeit, wartezeit 
from table ...... 
order by sort_wartezeit desc, wartezeit asc

dann kämen zuerst alle mit einer Wartezeit>0. Die haben alle sort_wartezeit = +1 und damit zieht die zweite ORDER BY spalte



Funktionieren müsste übrigens auch ein

PHP:
ORDER BY NULLIF(wartezeit,0)
 
Zuletzt bearbeitet:
Wartezeit = 0 bedeutet so viel wie noch keine Daten vorhanden
Tut mir leid, aber dein Datenmodell ist ja schon absoluter Schwachsinn.
Eine Wartezeit = 0 heisst nunmal, dass ich nicht warten musste, für den Zweck, dass keine Daten vorhanden sind wurde null erschaffen (von mir aus auch ein -1)
 
Oh ja, mein Fehler.
Natürlich
PHP:
IF(wartezeit=0,-1,+1)
... oder sonst zwei feste Werte.
Dann greift der 2. Sort nur noch innerhalb dieser fake-Gruppen.

Ich nehm für "nicht gesetzt" auch nie 0, sondern -1 oder so.
Da läuft man auch keine Gefahr, einen falschen 0-Vergleich zu führen.
So mit leeren Strings, false, null, ==, === und so Späßchen.
Gibt ja VIEL, was "0" sein kann, woran man gar nicht direkt denkt. ;)