una soporta segundo rapida por optimizar mas lentas inner hacer ejemplos cuantas consultas consulta con como sql mysql sorting

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.