Сортировка в MySQL

В этой статье приведены примеры использования оператора ORDER BY для сортировки записей в MySQL.

Синтаксис оператора ORDER BY:

SELECT 
	* 
FROM 
	`table`
ORDER BY 
	`столбец` [ASC | DESC]
SQL

ASC – (по умолчанию, необязательный). Сортирует набор в порядке возрастания или по алфавиту.

SELECT 
	* 
FROM 
	`table` 
ORDER BY 
	`name` ASC
SQL

DESC – сортирует в порядке убывания.

SELECT
	* 
FROM
	`table` 
ORDER BY 
	`name` DESC
SQL

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

SELECT
	* 
FROM 
	`table` 
ORDER BY 
	`name` DESC, `text` DESC
SQL

С помощью функции FIELD() можно получить записи из БД в нужной последовательности, например вывести первыми записи с определенными `id`.

SELECT 
	* 
FROM 
	`table` 
ORDER BY 
	FIELD(`id`, 1,2,3)
SQL

Также можно скомбинировать сортировку из нескольких полей и показать первыми приоритетные записи, а далее по алфавиту.

SELECT 
	* 
FROM 
	`table` 
 ORDER BY 
 	FIELD(`id`, 1,2,3) DESC, `name`
SQL

Или убрать в конец ненужные записи:

SELECT 
	* 
FROM 
	`table` 
ORDER BY 
	FIELD(`id`, 55), `name`
SQL

В списках товаров отсортировать значения цен по возрастанию, но при этом нулевые значения были в конце поможет следующий пример.

SELECT 
	*
FROM 
	`table` 
ORDER BY 
	IF(`price` > 0, 0, 1), `price`
SQL

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

SELECT 
	*, 
	(SELECT COUNT(*) FROM `prods` WHERE `brand_id` = `brands`.`id`) AS `prod_count` 
FROM 
	`brands` 
ORDER BY 
	`prod_count` DESC
SQL
SELECT 
	* 
FROM 
	`table` 
ORDER BY 
	RAND()
SQL

Проблема возникает если даты хранятся в текстовом виде (например 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
SQL

Если в сортируемом поле содержатся одновременно текст и цифры, а нужно отсортировать только по цифрам, то данные нужно привести к числовому типу:

SELECT
	*, 
	CAST(`name` AS SIGNED) AS `name_tmp` 
FROM 
	`table` 
ORDER BY 
	`name_tmp`
SQL

или

SELECT
	*
FROM 
	`table` 
ORDER BY 
	CAST(`name` AS SIGNED)
SQL

Для чисел с плавающей точкой:

SELECT
	*
FROM 
	`table` 
ORDER BY 
	CAST(`name` AS DECIMAL(11,2))
SQL
SELECT * FROM `table` ORDER BY CHAR_LENGTH(`name`) DESC
SQL
06.08.2020, обновлено 07.12.2021
32287

Комментарии

, чтобы добавить комментарий.

Другие публикации

jQuery UI Sortable - перетаскивание элементов
Перетаскивание элементов списков, плитки и строк таблиц с помощью плагина jQuery UI Sortable и методы сохранения...
35461
+12
Сортировка массивов
В продолжении темы работы с массивами поговорим о типичной задаче – их сортировке. Для ее выполнения в PHP существует множество функций, их подробное описание можно посмотреть на php.net, рассмотрим...
51653
+5
Пример парсинга html-страницы на phpQuery
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
46787
+20
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
56317
+20
Поиск похожих текстов в базе данных MySQL + PHP
Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.
4373
+4
Счетчик просмотров страниц с графиком
Для примера возьмем статейный сайт, на нём нужно сделать счетчик просмотров статей, с выводом результатов за день,...
13537
+18