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

Читать

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

Январь 19, 2023 г.

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

Читать

Как получить номер строки в MySql?

Ноябрь 5, 2016 г.

Что делать, если нужно пронумеровать строки прямо в запросе? Полистав руководство MySql 5.5, нужной функции я не нашел. Мне нужно было сохранять позиции пользователей в рейтинге, т.е. пронумеровать пользователей в зависимости от значения их рейтинга. ...

Читать

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

Ноябрь 11, 2019 г.

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

Читать
 

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

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



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