MySQL: получить самый последнюю строчку (что не так с MAX() и не только)

MySQL: получить самый последнюю строчку (что не так с MAX() и не только)

· SQL и Снипеты · 2 мин чтения

В этой записи, я опишу два способа получить самую актуальную строчку из базы данных.

Вариант без WHERE

Этот вариант подразумевает отсутствие WHERE, чтобы в самом первом SQL запросе (где используется MAX()) все сработало как нужно.

Если вы хотите получить максимальное значение определенной колонки, то вам подойдет MAX(). Если вы хотите получить максимальное значение по определенной колонки с логическим оператором, на подобии WHERE, то MAX() вам уже не поможет — второй пример ниже.

Давайте напишем простой запрос: получить максимальное время по колонке updated_atupdated_at в моем случае int(11), хранит она UNIX время, в формате 1526911210.

SELECT MAX( `updated_at` ) AS upd
FROM `orders`

В результате вы получаете следующее:

+------------+
| upd        |
+------------+
| 1526911210 |
+------------+

Точно такого же результат можно добиться используя SQL ниже:

SELECT `updated_at` AS upd FROM `orders` ORDER BY upd DESC LIMIT 1;

Результат:

+------------+
| upd        |
+------------+
| 1526911210 |
+------------

Вариант с WHERE

Сделаем точно такой же запрос как в варианте выше, только немного перепишем его:

  • удалить MAX()
  • вместо этого используем ORDER BY и DESC
  • так же добавим WHERE

type в примере ниже, это VARCHAR(20) колонка, которая обозначает тип заказа. В примере, я буду искать все заказы на продажу («sell»).

Запрос:

SELECT `updated_at` AS upd FROM `orders` WHERE `type`='sell' ORDER BY upd DESC LIMIT 1;

Результат:

+------------+
| upd        |
+------------+
| 1526111210 |
+------------

Объяснение:

  • ORDER BY — сортировка по колонке updupd — это наш алиас, который мы указали в начале запроса — «AS upd».
  • DESC — означает, что сортировка должна быть в порядке убывания (DESC = descending order)

Тем самым, на русском языке, запрос звучал бы так:

Выбираю «updated_at», но назови ее «upd» из таблицы «orders», но, пожалуйста, только с типом (type) «sell» и верни все в порядке убывания «upd».

Вопросы?

Задай мне вопрос под записью и в ближайшее время я вам отвечу :)