Чтобы получить последние сообщения от каждого пользователя, вам нужно сделать выборку из таблицы сообщений с использованием группировки по пользователю и получения последнего сообщения. В SQL это можно сделать с помощью подзапросов или функции `ROW_NUMBER()`. Вот пример, как это можно реализовать:
### Используя `ROW_NUMBER()`
Если ваша база данных поддерживает оконные функции (например, PostgreSQL, MySQL 8.0+, SQL Server и др.), вы можете использовать следующий запрос:
```sql
SELECT m.*
FROM (
SELECT id, from_id, to_id, message,
ROW_NUMBER() OVER (PARTITION BY from_id ORDER BY id DESC) as rn
FROM messages
) m
WHERE rn = 1;
```
Этот запрос:
1. Определяет номер строки (`ROW_NUMBER()`) для каждого сообщения, группируя их по `from_id` и упорядочивая по `id` в порядке убывания (последние сообщения будут первыми).
2. Внешний запрос выбирает только те сообщения, которые имеют номер строки 1, что соответствует последнему сообщению от каждого пользователя.
### Используя подзапрос
Если ваш SQL-диалект не поддерживает оконные функции, вы можете использовать подзапрос:
```sql
SELECT m.*
FROM messages m
JOIN (
SELECT from_id, MAX(id) as max_id
FROM messages
GROUP BY from_id
) m_max ON m.id = m_max.max_id;
```
В этом запросе:
1. Внутренний запрос находит максимальный `id` (последнее сообщение) для каждого `from_id`.
2. Внешний запрос соединяет результат с таблицей `messages`, чтобы получить все поля сообщения, соответствующие найденному `max_id`.
### Объединение с таблицей пользователей
Если вам также нужны данные о пользователях, вы можете объединить результаты с таблицей пользователей:
```sql
SELECT u.name, m.message
FROM (
SELECT m.*
FROM messages m
JOIN (
SELECT from_id, MAX(id) as max_id
FROM messages
GROUP BY from_id
) m_max ON m.id = m_max.max_id
) m
JOIN users u ON m.from_id = u.id;
```
Этот запрос вернёт имена пользователей и их последние сообщения. Вы можете изменить выборку, если вам нужны другие поля.