Сортування результатів при використанні distinct в mysql
Персональна сторінка shra, блог фріленсерів, веб-розробника на PHP. Тут я ділюся своїм досвідом і думками, проводжу досліди над людьми, збираю нематеріальні свідоцтва власної дурості. Використовуючи приклади програмного коду з даного сайту, ви приймаєте всю відповідальність за можливі наслідки їх використання, включаючи ваше психічне здоров'я і інтереси третіх осіб.
Блог / mySQL / Сортування результатів при використанні DISTINCT в MySql
Є один феномен, пов'язаний з внутрішньою сортуванням в mySQL, яка служить для реалізації функціоналу DISTINCT (вибору унікальних значень). Якщо ви намагаєтеся сортувати по стовпцю приєднаної таблиці, відсутньому в результатах запиту, то сортування ORDER BY не працюватиме так, як ви очікуєте.
Розглянемо приклад. Тут я намагаюся впорядкувати список публікацій (це база Drupal) по датах, вказаних у зовнішній таблиці з деяким рейтингом. Рейтинг може бути проставлений багаторазово, тому я відкидаю дублі по DISTINCT.
Замість inner join-а існуючої таблиці, ми приєднуємо тимчасову. Сортування проводиться вже по приєднаному одну last_dtm.
Результат останнього запиту:
Від другого варіанту відрізняється видача останніх трьох рядків. Вони мають однакове значення дати (dtm) - стовпці, по якому проводиться сортування.
Ще варіанти…
Я згадав, що сортування за стовпцями основної таблиці проходить без проблем. Якщо структура даних дозволяє, то можна додати потрібний для сортування стовпець в основну таблицю. Ми можемо, наприклад, встановлювати останню дату виставлення рейтингу (dtm) кожен раз при додаванні записів в rating_log, і поміщати це значення в доп. стовпець таблиці node.
У певних випадках сортування або відсіювання дублів можна виробляти на стороні PHP, тоді проблема теж буде знята.
Іноді потрібно вибрати рядки з бази даних у випадковому порядку. При сайтобудівництва ця задача виникає досить часто - вивести випадкову тему з форуму, показати в блоці випадковий просувний товар, показати випадковий відповідь відвідувача за останню.

MySQL дозволяє використовувати курсори (CURSORs) в збережених процедурах. Ця конструкція дозволяє організувати складну обробку даних на стороні сервера.