Как отсортировать данные по убыванию в MySQL?

Как можно сгруппировать записи в вашем запросе в порядке убывания? Требуется, чтобы подзапрос возвращал самую последнюю запись, и чтобы весь запрос также брал самые последние записи, а не первые. Можно ли сделать группировку так, чтобы оставались только последние результаты, а не первые? Как я могу правильно скорректировать запрос?
  • 19 февраля 2024 г. 12:28
Ответы на вопрос 2
Для сортировки данных по убыванию в MySQL используется ключевое слово `DESC` после имени столбца в операторе `ORDER BY`.

Пример запроса с сортировкой по убыванию:

```sql
SELECT * FROM table_name ORDER BY column_name DESC;
```

Чтобы сгруппировать записи в порядке убывания и получить только самые последние записи, можно использовать подзапрос с функцией `MAX()` для определения последней записи в каждой группе, а затем объединить его с основным запросом с помощью оператора `IN`.

Пример запроса с группировкой по убыванию и выбором только последних записей:

```sql
SELECT * FROM table_name WHERE (column_name, date_column) IN 
(SELECT column_name, MAX(date_column) 
FROM table_name 
GROUP BY column_name);
```

Здесь `column_name` - это столбец, по которому вы хотите сгруппировать данные, а `date_column` - столбец даты или времени, который определяет последнюю запись в группе.

Таким образом, этот запрос вернет только последние записи для каждого уникального значения в столбце `column_name`, отсортированные по убыванию даты.
Если у вас MySQL 8+ версия, то список чатов получается тривиально - используя оконную функцию: 
SELECT A.*
(
SELECT class_messages.id as class_messages_id
      `class_messages_chat`.`to_user_id`,
       `class_messages_chat`.`from_user_id`,
       `class_users`.`id`,
       `class_users`.`user_status`,
       `class_users`.`online`,
       `class_messages_chat`.`chat_id`,
       `class_messages_chat`.`ad_id`,
       `class_ads`.user_id,
       `class_ads`.title,
       row_number() over (partition by `class_messages_chat`.`chat_id` order by class_messages.id desc) rn -- этой функцией нумеруем в пределах чата сообщения
    FROM `class_messages_chat`
    inner join `class_ads` on `class_messages_chat`.ad_id = `class_ads`.id
    INNER JOIN `class_users` ON `class_users`.`id`=`class_ads`.`user_id`
    inner join `class_messages` on `class_messages_chat`.`chat_id` = `class_messages`.`chat_id`
WHERE (   `class_messages_chat`.`to_user_id` = 133337
       or `class_messages_chat`.`from_user_id` = 133337)
and class_messages_chat.chat_id is not null
) A
where A.Rn = 1 -- оставляем, все что с первым номером счетчика
order by A.class_messages_id desc
Похожие вопросы