2010-02-13 2 views
19

У меня есть эта таблица (упрощенный):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 в прошлом, упорядоченный по идентификатору

Я попытался это:

 
    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 

?

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

ответ

33

Это будет делать трюк ..

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

+1 для чтения вопроса. –

+0

Замечательно, спасибо! Один вопрос, 1 и -1 от THEN и ELSE, что они означают? – ecstrim

+3

Это означает, что когда цена равна 0, назначьте 1 для сортировки, иначе укажите -1. Любые два значения будут работать, если значение THEN больше значения ELSE. –

17

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

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

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

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

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

Смежные вопросы