Подтвердить что ты не робот

MySql условный заказ

У меня есть эта таблица (упрощенная):

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

Мне нужно выбрать все элементы из таблицы, упорядоченные таким образом:
1. Предметы с ценой > 0.00 сначала, заказываемые по цене ASC
2. предметы с ценой = 0.00 последний, упорядоченный по id

Я пробовал это:

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

И я получаю результаты вроде

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

Как создать запрос для

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

?

Спасибо за ваше время

4b9b3361

Ответ 1

Это сделает трюк.

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

Ответ 2

Вы также можете использовать следующее:

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

Часть "цена = 0" будет равна 1 для предметов с нулевой ценой, 0 для предметов с ненулевой ценой. Поскольку порядок сортировки по умолчанию - это ASC, сначала устанавливаются ненулевые элементы.

Следующий бит предложения order-by означает, что ненулевые элементы сортируются по цене (снова по возрастанию). Если какие-либо предметы с ненулевой ценой имеют одинаковую цену, они будут отсортированы по id, но нас это не волнует.

Последняя часть есть только для элементов, где price = 0. Поскольку все эти элементы имеют одинаковую цену, эффект заключается в сортировке всех нулевых предметов по идентификатору.