soporta - optimizar consultas lentas mysql
MySql orden condicional por (2)
Tengo esta tabla (simplificada):
CREATE TABLE `my_table` ( `id` INT NOT NULL AUTO_INCREMENT , `item_name` VARCHAR(45) NULL , `price` DECIMAL(10,0) NULL , PRIMARY KEY (`id`) )
Necesito seleccionar todos los artículos de la tabla, ordenados de esta manera:
1. Artículos con precio> 0.00 primero, ordenados por precio ASC
2. Artículos con precio = 0.00 último, ordenados por ID
Intenté esto:
SELECT * FROM my_table WHERE 1 ORDER BY CASE price WHEN !0.00 THEN price ELSE id END ASC
Y obtengo resultados como
item_name | price ----------|------- foo | 150,00 bar | 0,00 baz | 500,00 hum | 0,00
¿Cómo construyo la consulta para tener
item_name | price ----------|------- foo | 150,00 baz | 500,00 bar | 0,00 hum | 0,00
?
Gracias por tu tiempo
Esto hará el truco ..
SELECT *
FROM my_table
WHERE 1
ORDER BY
CASE price WHEN 0 THEN 1
ELSE -1
END ASC, price asc, id asc
También puedes usar lo siguiente:
SELECT *
FROM my_table
WHERE 1
ORDER BY price=0, price, id;
La parte ''precio = 0'' será 1 para artículos con precio cero, 0 para artículos con precio diferente a cero. Como el orden predeterminado es ASC, los elementos que no son cero ahora se colocan primero.
El siguiente bit de la cláusula de orden significa que los artículos que no son cero se clasifican por precio (nuevamente ascendente). Si algún artículo con precio distinto de cero tiene el mismo precio, se ordenará más por ID, pero eso no nos importa.
La última parte es solo para 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 ID.