Главная   Новости   Поиск   
Азбука программиста




Яндекс.Метрика

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

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

О сортировке данных при помощи SQL запросов, знают все web разработчики. Довольно указать в тексте sql-запроса предложение ORDER BY с подходящими параметрами и вы получите хотимый итог.

Параметры сортировки задавать тоже нетрудно. Просто перечисляете через запятую столбцы по которым необходимо выполнить сортировку и указываете её направление (по возрастанию (ASC) либо по убыванию (DESC)). Можно вместо наименования полей указывать их порядковый номер в селект-листе. Но это плохой тон.

Запрос, выполняющий сортировку может смотреться приблизительно последующим образом:

SELECT * FROM persida ORDER BY a_title ASC, a_date DESC

В данном случае записи из таблицы persida будут отсортированы в вырастающем порядке по полю a_title, а для записей у каких совпадают значения в поле a_title – по полю a_date в убывающем порядке. В таковой форме употребляются способности сортировки почти всегда, пример можно увидеть на сайте с играми про Дашу. Но встречаются ситуации, в каких необходимо использовать более сложные правила.

Сортировка с учетом типа данных

Представьте, что у вас есть две таблицы. 1-ая содержит какие-нибудь записи (статьи, анонсы, продукты и т.п.), а 2-ая – метаданные для этих записей. Метаданные могут содержать какую угодно информацию, к примеру, рейтинг анонсы либо цвет продукта.

Подобные решения употребляются в почти всех CMS, т.к. создатели не знают какие конкретно метаданные будет использовать разработчик веб-сайта и предоставляют ему возможность создавать их в огромном количестве. Но что произойдет если мы попытаемся выполнить сортировку по метаданным?

Такую сортировку можно выполнить при помощи sql-запроса:

SELECT * FROM persida a LEFT JOIN metadata m ON a.a_id=m.m_article_id WHERE m.m_name="color"

Этот запрос выведет все записи из таблицы persida для которых сотворено мета-поле color.

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

При всем этом числовые данные будут отсортированы не верно. Дело в том, что ORDER BY ассоциирует значения с учетом типа поля и, к примеру, при сортировке по возрастанию вы получите последующий ряд значений: «1», «10», «2», «3» и т.д.

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

SELECT * FROM metadata ORDER BY (m_value+0)

Операция по сортировке числового поля по правилам текстового записывается несколько иначе:

SELECT left(a_id, 20) AS id_str FROM persida ORDER BY id_str

Функция left возвращает строчку, содержащую 1-ые N знаков из строчки, обозначенной в первом параметре. Количество знаков (N) задается во 2-м параметре. В этом случае будут выбраны 1-ые 20 знаков (довольно чтоб конвертировать 8-байтное целое число в строчку). Т.е. движок MySQL выполнит сортировку по строке, приобретенной из значения числового поля.

Невзирая на то, что данные способы могут быть комфортны в ряде ситуаций, их внедрение приводит к понижению скорости выполнения SQL запросов. Потому злоупотреблять ими не стоит. С другой стороны, сортировка при помощи PHP (либо хоть какого другого языка) также займет какое-то время.

Сортировка с учетом регистра

Для текстовых полей сортировка производится без учета регистра. Почти всегда это верно, т.к. в таблице знаков строчная «А» идет после строчной «я». Т.е. отсортированные с учетом регистра строчки будут размещены в последующем порядке.

  1. «Язык з»
  2. «Язык п»
  3. «Язык З»

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

SELECT * FROM persida ORDER BY BINARY a_title Сортировка по куску строчки

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

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

SELECT SUBSTRING_INDEX(a_title, ' ', -1) AS at FROM wp_posts ORDER BY at Сортировка записей по данному списку значений

Допустим, что у вас есть записи, которые каким-то образом связаны с временем года. И вы храните эту информацию в одном из столбцов таблицы. Разумеется, что, используя стандартный вариант сортировки (по алфавиту), расположить сезоны порядке «весна», «лето», «осень», «зима» не получится. Естественно, можно каждому времени года присвоить собственный код, но есть и другой вариант решения – использовать функцию FIELD.

SELECT * FROM articles ORDER BY FIELD(a_season, "весна","лето","осень","зима")

Эта функция отыскивает значение, обозначенное в первом параметре, посреди значений, перечисленных в других параметрах, и возвращает его порядковый номер. При выполнении запроса в 1-ый параметр функции FIELD будут передаваться значения из поля a_season и, таким макаром, записи будут отсортированы в данном нами порядке.

Сортировка по длине

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

SELECT * FROM persida ORDER BY CHAR_LENGTH(a_title)

Видите ли, «фокус» заключается в использовании функции CHAR_LENGTH, которая определяет количество знаков в строке. 

 

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



Безопасность

В этой статье приводятся методы борьбы с вирусами. Опишем типовую ситуацию, которая знакома многим пользователям ПК: установлен новый антивирус, раз в день обновляются базы, все подозрительные файлы сразу удаляются. В один ясный, солнечный день вы приходите к другу и чтобы показать новые фотки, подключаете свою флешку к его компу. Но антивирус начинает вам говорить, сколько вирусов он отыскал на вашей флешке...

Читать далее