Сортировка результатов при использовании 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, тогда проблема тоже будет снята.

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

Ошибка MySQL Incorrect datetime value: '0000-00-00 00:00:00'

Февраль 16, 2023 г.

Появляется, если поле типа datetime уже содержит подобные нулевые значения при попытке изменить как тип поля (через alter table), так и сами значения в таблице. Вероятно ошибка возникает, если вы импортировали данные в вашу базу. Скорее всего из-за ...

Читать

Аналог strpos в mySQL

Февраль 4, 2019 г.

Недавно обнаружил, что в mySQL целых три аналога PHP функции strpos. INSTR(str,substr) - возвращает индекс первого найденного совпадения substr ...

Читать

Создание бекапов базы mySQL из консоли unix

Февраль 13, 2018 г.

Ещё одна шпаргалка по администрированию UNIX серверов. На этот раз рассмотрим несколько полезных команд для создания бекапа базы данных из консоли. Нам понадобится команда mysqldump, которая позволяет создавать sql скрипт базы или её части. Создание ...

Читать

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

Август 3, 2022 г.

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

Читать
 

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

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



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