2010-02-13 12 views
19

tengo esta tabla (simplificado):MySql orden condicionada por

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

tengo que seleccionar todos los elementos de la tabla, ordenó esta manera: 1.
artículos con precio> 0.00 primero, ordenada por precio ASC
2. artículos con precio = 0.00 pasada, ordenados por ID

he intentado esto:

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

Y i obtener resultados como

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

¿Cómo construir la consulta de tener

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

?

Gracias por su tiempo

Respuesta

33

Esto va a hacer el truco ..

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

+1 para leer la pregunta. –

+0

¡Maravilloso, muchas gracias! Una pregunta, la 1 y -1 de THEN y ELSE ¿qué significan? – ecstrim

+3

Significa que cuando el precio es 0, asigne 1 para el orden, de lo contrario asigne -1. Cualquiera de los dos valores funcionaría, siempre que el valor THEN sea mayor que el valor ELSE. –

17

también puede utilizar los siguientes:

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

La parte 'precio = 0' habrá 1 para artículos con precio cero, 0 para artículos con precio distinto de cero. Como el orden de clasificación predeterminado es ASC, los elementos que no son cero ahora se colocan primero.

El siguiente bit de la cláusula de orden por pedido significa que los artículos que no son cero se ordenan por precio (de nuevo ascendiendo). Si alguno de los artículos con precio distinto de cero tiene el mismo precio, se clasificarán adicionalmente por identificación, pero eso no nos importa.

La última parte solo está disponible para los artículos donde precio = 0. Como todos estos artículos tienen el mismo precio, el efecto es ordenar todos los artículos de precio cero por identificación.