2010-02-13 9 views
19

Ich habe diese Tabelle (vereinfacht):MySql bedingten Auftrag von

 
CREATE TABLE `my_table` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `item_name` VARCHAR(45) NULL , 
    `price` DECIMAL(10,0) NULL , 
    PRIMARY KEY (`id`)) 

Ich brauche alle Elemente aus der Tabelle auszuwählen, bestellt auf diese Weise:
1. Artikel mit Preis> 0.00 zuerst nach Preis sortiert ASC
2. Artikel mit Preis = 0.00 zuletzt, bestellt von id

ich versuchte dies:

 
    SELECT * 
    FROM my_table 
    WHERE 1 
    ORDER BY 
     CASE price WHEN !0.00 THEN price 
     ELSE id 
     END 
    ASC 

Und ich bekomme Ergebnisse wie

 
item_name | price 
----------|------- 
foo  | 150,00 
bar  | 0,00 
baz  | 500,00 
hum  | 0,00 

Wie erstelle ich die Abfrage

 
item_name | price 
----------|------- 
foo  | 150,00 
baz  | 500,00 
bar  | 0,00 
hum  | 0,00 

haben?

Vielen Dank für Ihre Zeit

Antwort

33

Dieser den Trick tun wird ..

SELECT * 
    FROM my_table 
    WHERE 1 
    ORDER BY 
     CASE price WHEN 0 THEN 1 
     ELSE -1 
     END ASC, price asc, id asc 
+0

+1 für das Lesen der Frage. –

+0

Wunderbar, vielen Dank! Eine Frage, die 1 und -1 von THEN und ELSE was bedeuten sie? – ecstrim

+3

Das bedeutet, wenn der Preis 0 ist, 1 für die Sortierung zuweisen, andernfalls -1 zuweisen. Beliebige zwei Werte würden funktionieren, solange der THEN-Wert größer als der ELSE-Wert ist. –

17

Sie auch die folgenden verwenden:

SELECT * 
FROM my_table 
WHERE 1 
ORDER BY price=0, price, id; 

Der Teil 'Preis = 0' wird 1 für Artikel mit Nullpreis, 0 für Artikel mit Nichtnullpreis. Da die Standardsortierreihenfolge ASC ist, werden Elemente ungleich null jetzt zuerst platziert.

Das nächste Bit der Order-by-Klausel bedeutet, dass Objekte ungleich Null dann nach Preis sortiert werden (wieder aufsteigend). Wenn Artikel mit einem Preis ungleich Null den gleichen Preis haben, werden sie weiter nach ID sortiert, aber das interessiert uns nicht.

Der letzte Teil ist nur für Artikel mit Preis = 0 da. Da alle diese Artikel den gleichen Preis haben, ist der Effekt, alle Artikel mit einem Preis von Null nach ID zu sortieren.