Сортировка результатов при использовании DISTINCT в MySql

Есть один феномен, связанный с внутренней сортировкой в mySQL, которая служит для реализации функционала DISTINCT (выбора уникальных значений). Если вы пытаетесь сортировать по столбцу присоединенной таблицы, отсутствующему в результатах запроса, то сортировка ORDER BY не будет работать так, как вы ожидаете.

Рассмотрим пример. Здесь я пытаюсь отсортировать список публикаций (это база Drupal) по датам, указанным во внешней таблице с некоторым рейтингом. Рейтинг может быть проставлен многократно, потому я отбрасываю дубли по DISTINCT.

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

а результаты следующие:

request-v1 request-v2
результат первого
запроса
результат второго запроса (со столбцом,
по которому проводится сортировка)

Первые три строки совпали, а дальше результаты расходятся.

Сортировка ORDER BY по столбцам основной таблицы (node) в запросе №2, будет производится как и ожидается — в порядке убывания дат. Значит в первом запросе этот порядок иной, не тот что мы ожидаем. Второй пример указывает нам на то, что нужно каким то образом «присоединить» нужные столбцы к основной таблице. Это можно сделать с помощью временной таблицы, не выходя за рамки одного предложения SELECT.

Вместо inner join-а существующей таблицы, мы присоединяем временную. Сортировка производится уже по присоединенному столбцу last_dtm.

Результат последнего запроса:

request-v3

От второго варианта отличается выдача последних трех строк. Они имеют одинаковое значение даты (dtm) — столбца, по которому производится сортировка.

Ещё варианты…

Я упомянул, что сортировка по столбцам основной таблицы проходит без проблем. Если структура данных позволяет, то можно добавить нужный для сортировки столбец в основную таблицу. Мы можем, к примеру, устанавливать последнюю дату выставления рейтинга (dtm) каждый раз при добавлении записей в rating_log, и помещать это значение в доп. столбец таблицы node.

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

Мало букафф? Читайте есчо !

Как изменить значение AUTO_INCREMENT таблицы в MySQL

Август 3, 2022 г.

Наиболее простой ответ - это использование запроса alter, где вы задаёте новое значение для AUTO_INCREMENT нужной вам таблицы: [crayon-6a866ed6ef04b100954199/] Вы можете достичь такого же эффекта изменениями соответствующего столбца вашей таблицы: ...

Читать

Как выполнить mysql запрос из командной строки

Январь 19, 2023 г.

Допустим, у вас запущен локально сервер, и есть база myBase с и учетка пользователя UserName/MyPass. Вы хотите выполнить запрос "SELECT * FROM TABLE" из командной строки. Команда передаётся с параметром -e, в общем виде запрос будет выглядеть так: ...

Читать

Как удалить дубликаты из таблицы в MySQL

Сентябрь 24, 2025 г.

Под дублями можно иметь в виду разные условия. Возьмем как пример таблицу имен. В этой таблице есть повторяющиеся значения в поле name. Разберём практический способ удалить такие записи в MySQL с помощью одного SQL-запроса. Пример исходной таблицы ...

Читать

Mysqldump без блокировки таблиц

Ноябрь 11, 2019 г.

По умолчанию для mysqldump требуются права пользователя на блокировку таблиц. Потому, когда вы создаёте бекапы, вы можете получить сообщение вроде: mysqldump: Got error: 1044: "Access denied for user 'USER'@'%' to database 'DATABASENAME'" when ...

Читать
 

Комментарии к «Сортировка результатов при использовании DISTINCT в MySql»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: