Ответ 1
Это сделает трюк.
SELECT *
FROM my_table
WHERE 1
ORDER BY
CASE price WHEN 0 THEN 1
ELSE -1
END ASC, price asc, id asc
У меня есть эта таблица (упрощенная):
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
?
Спасибо за ваше время
Это сделает трюк.
SELECT *
FROM my_table
WHERE 1
ORDER BY
CASE price WHEN 0 THEN 1
ELSE -1
END ASC, price asc, id asc
Вы также можете использовать следующее:
SELECT *
FROM my_table
WHERE 1
ORDER BY price=0, price, id;
Часть "цена = 0" будет равна 1 для предметов с нулевой ценой, 0 для предметов с ненулевой ценой. Поскольку порядок сортировки по умолчанию - это ASC, сначала устанавливаются ненулевые элементы.
Следующий бит предложения order-by означает, что ненулевые элементы сортируются по цене (снова по возрастанию). Если какие-либо предметы с ненулевой ценой имеют одинаковую цену, они будут отсортированы по id, но нас это не волнует.
Последняя часть есть только для элементов, где price = 0. Поскольку все эти элементы имеют одинаковую цену, эффект заключается в сортировке всех нулевых предметов по идентификатору.