2010-02-13 2 views
19

ho questa tabella (semplificato):MySql ordine condizionato da

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

ho bisogno di selezionare tutti gli elementi dalla tabella, ordinato in questo modo:
1. Gli articoli con il prezzo> 0.00 prima, in ordine di prezzo ASC
2. articoli con prezzo = 0.00 ultima, in ordine di id

ho provato questo:

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

E ottengo risultati come

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

Come faccio a costruire la query di avere

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

?

Grazie per il vostro tempo

risposta

33

Questo farà il trucco ..

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

+1 per leggere la domanda. –

+0

Meraviglioso, grazie mille! Una domanda, 1 e -1 da THEN e ELSE cosa significano? – ecstrim

+3

Significa che quando il prezzo è 0, assegna 1 per l'ordinamento, altrimenti assegna -1. Qualsiasi due valori funzionerebbe, a condizione che il valore THEN sia maggiore del valore ELSE. –

17

È inoltre possibile utilizzare il seguente:

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

La parte 'prezzo = 0' sarà 1 per articoli con prezzo zero, 0 per articoli con prezzo diverso da zero. Poiché l'ordinamento predefinito è ASC, gli elementi diversi da zero vengono ora posizionati per primi.

Il bit successivo della clausola order-by significa che gli elementi diversi da zero vengono quindi ordinati per prezzo (sempre in ordine crescente). Se alcuni articoli con prezzo diverso da zero hanno lo stesso prezzo, saranno ulteriormente ordinati per id, ma non ci interessa.

L'ultima parte è presente solo per articoli con prezzo = 0. Poiché tutti questi articoli hanno lo stesso prezzo, l'effetto è di ordinare tutti gli articoli a prezzo zero per id.