Mysql выбор цены и количества

Рейтинг: 2Ответов: 2Опубликовано: 10.12.2014

Есть некая таблица с содержанием:

+------+-------+----------+
| name | price | quantity |
+------+-------+----------+
| alip | 10    | 0        |
+------+-------+----------+
| mime | 200   | 0        |
+------+-------+----------+
| vini | 70    | 1        |
+------+-------+----------+
| simi | 30    | 10       |
+------+-------+----------+

Нужно отсортировать в

+------+-------+----------+
| name | price | quantity |
+------+-------+----------+
| simi | 30    | 10       |
+------+-------+----------+
| vini | 70    | 1        |
+------+-------+----------+
| alip | 10    | 0        |
+------+-------+----------+
| mime | 200   | 0        |
+------+-------+----------+

То есть сначала идет выборка по количеству, если поле меньше одного, то оно полюбому будет идти после поля с количеством большее нуля. Причем потом все товары должны отсортироваться по цене.

Я делаю так:

SELECT * FROM
(SELECT * FROM `exp` ORDER BY `quantity` ASC) a
ORDER BY `price` ASC

Или

SELECT * FROM
(SELECT * FROM `exp` WHERE quantity > 0 ORDER BY `price` ASC) a,
(SELECT * FROM `exp` WHERE quantity  < 1 ORDER BY `price` ASC) b

Но естественно всё идет не так, как хочется. Не пойму, как сделать правильный запрос.

Пример: http://sqlfiddle.com/#!2/7ebf1/8

Ответы

▲ 2Принят

Нулевые количества в конце, все по цене.

select * from exp
order by quantity<1, price
▲ 1

Если вам действительно нужен вариант, который указал тов. @Yura Ivanov (т.е. "с нулевым количеством" - в конце, а "не с нулевым" не обязательно отсортированные по количеству), тогда будет намного лучше использовать немного другой подход:

  • создаем дополнительное поле is_absent, которое динамически обновляем (если количество равно 0, то ставим здесь true, обновлять можно, например, тригерами)
  • добавляем это поле во все индексы. Если нам будет не нужна указанная в задаче сортировка, тогда можно будет добавить в запрос условие WHERE is_absent IN (true, false)

Такой запрос будет обработан намного быстрее, чем использовать ORDER BY quantity<1, т.к. в данном случае сработает filesort. Даже добавление индекса по полю quantity не спасет от него.

Кроме того, добавление is_absent очень поможет в ситуации, когда надо убрать отсутствующие товары. Здесь опять же - WHERE quantity > 0 усложнит запрос (даже при наличии индекса), MySQL не сможет использовать некоторые индексы/оптимизации и т.д.

Т.е. в итоге ваш запрос примет вид:

SELECT * FROM exp
ORDER BY is_absent, price