В этой статье приведены примеры использования оператора ORDER BY для сортировки записей в MySQL.
Синтаксис оператора ORDER BY:
SELECT
*
FROM
`table`
ORDER BY
`столбец` [ASC | DESC]
ASC – (по умолчанию, необязательный). Сортирует набор в порядке возрастания или по алфавиту.
SELECT
*
FROM
`table`
ORDER BY
`name` ASC
DESC – сортирует в порядке убывания.
SELECT
*
FROM
`table`
ORDER BY
`name` DESC
Также возможно сделать сортировку по несколькольким столбцам, указывая их через запятую в порядке приоритета.
SELECT
*
FROM
`table`
ORDER BY
`name` DESC, `text` DESC
С помощью функции FIELD() можно получить записи из БД в нужной последовательности, например вывести первыми записи с определенными `id`.
SELECT
*
FROM
`table`
ORDER BY
FIELD(`id`, 1,2,3)
Также можно скомбинировать сортировку из нескольких полей и показать первыми приоритетные записи, а далее по алфавиту.
SELECT
*
FROM
`table`
ORDER BY
FIELD(`id`, 1,2,3) DESC, `name`
Или убрать в конец ненужные записи:
SELECT
*
FROM
`table`
ORDER BY
FIELD(`id`, 55), `name`
В списках товаров отсортировать значения цен по возрастанию, но при этом нулевые значения были в конце поможет следующий пример.
SELECT
*
FROM
`table`
ORDER BY
IF(`price` > 0, 0, 1), `price`
К примеру имеется таблица брендов и товаров, нужно отсортировать бренды по количеству товаров.
SELECT
*,
(SELECT COUNT(*) FROM `prods` WHERE `brand_id` = `brands`.`id`) AS `prod_count`
FROM
`brands`
ORDER BY
`prod_count` DESC
SELECT
*
FROM
`table`
ORDER BY
RAND()
Проблема возникает если даты хранятся в текстовом виде (например 23.09.2020). Если отсортировать таблицу по такому полю, то результате будут перепутаны месяцы.
Текстовую дату нужно перевести в тип datetime c помощью функции STR_TO_DATE(), указав нужный формат:
SELECT
*,
STR_TO_DATE(`date`, '%d.%m.%Y') AS `tmp_date`
FROM
`table`
ORDER BY
`tmp_date` DESC
Если в сортируемом поле содержатся одновременно текст и цифры, а нужно отсортировать только по цифрам, то данные нужно привести к числовому типу:
SELECT
*,
CAST(`name` AS SIGNED) AS `name_tmp`
FROM
`table`
ORDER BY
`name_tmp`
или
SELECT
*
FROM
`table`
ORDER BY
CAST(`name` AS SIGNED)
Для чисел с плавающей точкой:
SELECT
*
FROM
`table`
ORDER BY
CAST(`name` AS DECIMAL(11,2))
SELECT * FROM `table` ORDER BY CHAR_LENGTH(`name`) DESC





