2016-03-21 12 views
1

Ich arbeite an einem bestehenden Projekt und habe diese SQL-Anweisung gefunden. Nach der Überprüfung der MySQL documentation, bin ich immer noch verwirrt durch die Syntax und wie MySQL es interpretiert.Wie interpretiert MySQL: ORDER BY CASE Status WANN 1 DANN 1 ELSE -1 END DESC

Ich habe eine Spalte namens status, die 0 (inaktiv), 1 (aktiv), 2 (abgeschlossen), 3 (testen) sein kann.

ORDER BY CASE status WHEN 1 THEN 1 ELSE -1 END DESC, id ASC

Was mich verwirrt ist THEN 1 ELSE -1. In der documentation erwähnt es, dass Sie eine statement_list nach platzieren. Ich würde erwarten, so etwas zu sehen:

ORDER BY CASE status WHEN 1 THEN status ELSE -1 (or some other value that will be ignored) END DESC, id ASC

Wie MySQL interpretiert THEN 1 ELSE -1? Ich bin gespannt, wie diese Aussage die richtigen Ergebnisse liefert. Dies geschieht im Prinzip wie folgt: Wenn Status = 1, dann ignorieren Sie ORDER BY status DESC sonst die Reihenfolge nach Anweisung.

+0

werden alle den Status = 1 vor Status setzen = alle others.So wenn status = 1 es Aufträge durch 1, wenn Status! = 1 es Aufträge durch -1.Since es ist DESC status = 1 kommt vor Status = -1 – Mihai

+0

'statement_list' ist eigentlich irreführend, da die Liste mehrere * was auch immer * beinhaltet, aber es ist nur eine ... – dnoeth

Antwort

1

ORDER BY CASE Status WENN 1 THEN 1 ELSE -1 END DESC, id ASC

Das bedeutet, es wird durch (1 oder -1 DESC, id ASC) effektiv bestellen.

Basierend auf dem Wert des Status wird eine 1 oder -1 als erster Ausdruck nach Reihenfolge und "ID ASC" ist der Tiebreaker. Zeilen mit status = 1 werden zuerst in das Ergebnis kommen (geordnet nach id in aufsteigender Reihenfolge) und Zeilen mit anderen Werten für status werden danach zurückgegeben (ihre Reihenfolge wird nicht weiter spezifiziert).

+0

Sie sagten" Basierend auf dem Wert des Status wird eine 1 oder -1 als erster Ausdruck von "But what Spalte ist das Ordnen nach? Ich gehe davon aus, dass es nach "Status" sortiert, aber ich würde wirklich gerne eine Dokumentation sehen, die die verschiedenen Möglichkeiten zeigt, wie ich diese Aussage verwenden kann. Ich habe das Gefühl, ich errate gerade jetzt seine Ergebnisse. – zechdc

+0

@zechdc: Es wird mit dem Wert 1 oder -1 sortiert. Es sortiert nicht nach Status, sondern verwendet den Statuswert, um zu bestimmen, ob eine 1 oder -1 verwendet werden soll. Das heißt, Sie haben eine gewisse Kontrolle darüber, wie die Zeilen angeordnet sind, aber es ist wirklich Mysql, in welcher Reihenfolge die Zeilen zurückgegeben werden (weil es nur in absteigender Reihenfolge nach 1 oder -1 sortiert ist). –

+0

Was macht das Ordnen um 1 oder -1? Wählt mysql nur zufällig eine Spalte und sortiert sie DESC? – zechdc

0

Es würde durch aktiven Status zuerst (1) wegen der DESC-Klausel bestellen, dann würde alles andere danach zurückgegeben werden. Alles, was -1 zugewiesen ist, kann zufällig angeordnet sein.

Verwandte Themen