Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySql conditional order by

Tags:

I have this table (simplified):

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

I need to select all items from the table, ordered this way:

  1. items with price > 0.00 first, ordered by price ASC
  2. items with price = 0.00 last, ordered by id

I tried this:

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

And I get results like

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

How do I build the query to have

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

Thank you for your time

like image 974
ecstrim Avatar asked Feb 13 '10 17:02

ecstrim


1 Answers

This will do the trick..

 SELECT *      FROM my_table      WHERE 1       ORDER BY        CASE price WHEN 0 THEN 1        ELSE -1       END ASC, price asc, id asc 
like image 137
Gabriele Petrioli Avatar answered Oct 05 '22 23:10

Gabriele Petrioli