MySql условный заказ по - PullRequest
       10

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

21 голосов
/ 13 февраля 2010

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

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

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

Ответы [ 2 ]

39 голосов
/ 13 февраля 2010

Это сделает свое дело ..

 SELECT * 
    FROM my_table 
    WHERE 1  
    ORDER BY 
      CASE price WHEN 0 THEN 1
       ELSE -1
      END ASC, price asc, id asc
19 голосов
/ 14 февраля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...