MySQL Query - Как упорядочить результаты определенным образом - PullRequest
1 голос
/ 02 января 2012

Ниже приведен предварительный просмотр того, что я имею до сих пор:

enter image description here

MySQL Table:

enter image description here

Что я хочу сделать, так это уметь сортировать это определенным образом. Я хотел бы, чтобы все строки, которые "БЕСПЛАТНЫ", были на самом верху, поэтому, где special_price равен 0,00.

Я также хотел бы, чтобы все строки со специальными значениями были после этого, и тогда после этого были бы все строки с обычной ценой. Есть ли способ сделать это без указания sort_id, чтобы пользователю не пришлось менять порядок самостоятельно?

Таким образом, в приведенном выше примере последнее поле «Тестирование» будет перемещено на единицу вверх, а «Заменить воздушный фильтр» будет последним.

Прямо сейчас в моем запросе нет ORDER BY, поэтому он упорядочен по идентификатору.

Любая помощь приветствуется. Спасибо!

Ответы [ 4 ]

2 голосов
/ 02 января 2012
ORDER BY COALESCE(special_price,99999) ASC, price ASC

должно сработать.

Объяснение

COALESCE - это функция, которая принимает первое ненулевое значение, поэтому, где бы у вас ни была специальная цена, онапо умолчанию 99999 (просто какое-то произвольное старшее число, чтобы получить его в конце заказа).Оттуда мы заказываем по цене, поэтому любые связи, как и конец списка, будут в порядке возрастания цены.

1 голос
/ 02 января 2012

Использование возвращаемого значения функции для сортировки результатов может быть очень медленным, если вы сортируете большое количество строк, потому что MySQL не может использовать индекс для сортировки этих значений.Итак, как обойти это?

Если элемент ДОЛЖЕН быть на специальном уровне, чтобы быть свободным (что, кажется, имеет место из предоставленного вами макета таблицы), вы можете попробовать:

SELECT *, special_price IS NULL AS not_special
FROM tablename
ORDER BY not_special ASC, special_price ASC, price ASC;

Это добавляет дополнительный столбец к результатам, который равен 0, если элемент находится в специальном, 1, если нет.Затем мы помещаем все «специальные» элементы в верхнюю часть сортировки и сортируем по возрастанию по специальной цене и цене.

Это позволит вам избежать накладных расходов на UNION, по-прежнему используя индекс для сортировки.и избегайте очень медленных запросов при сортировке большого количества строк с возвращаемым значением функции ... но только если элемент должен быть специальным, чтобы быть свободным.

1 голос
/ 02 января 2012

Вы можете объединить два выбора с UNION

SELECT * FROM `table` WHERE `special_price` IS NOT NULL ORDER BY `special_price` ASC,`price` ASC;
UNION ALL
SELECT * FROM `table` WHERE `special_price` IS NULL ORDER BY `price` ASC;

Я не знаю, как это ведет себя с точки зрения производительности, но, насколько я знаю, это похоже на два простых запроса с небольшими накладными расходами от UNION.

Незначительное обновление: поскольку оба запроса не могут вернуть одинаковые записи, поведение по умолчанию UNION DISTINCT не требуется, и я надеюсь, что UNION ALL чуть более производительно.

0 голосов
/ 02 января 2012

попробуй

SELECT * FROM table_name ORDER BY CASE special_price
        WHEN '0.00' THEN 1
        WHEN null THEN 3
        ELSE 2
    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...