Как сделать одну выборку для каждого пользователя

У меня в таблице примерно такое:

введите сюда описание изображения

Это таблица отправки сообщений. В этой таблице могут находиться больше 10000 записей. У меня например id = 1 Я бы хотел узнать, как получить последнюю запись с тем пользователем, которым я переписывался? Например с одним пользователем(3) есть записи id = 1, 4, 7. Чтобы получить последнюю запись (в данном случае id = 7) и так с каждым, одним запросом.


Ответы (2 шт):

Автор решения: radar4ick

Как то так. Запрос вернет по одной строке для пользователя 1 ('from') и последней записью каждого собеседника

WITH q AS
         (
         SELECT  c.*, ROW_NUMBER() OVER (PARTITION BY `to` ORDER BY id DESC) rn
         FROM messages c
         WHERE c.`from` = 1

         )
SELECT   *
FROM     q
WHERE    rn = 1 
→ Ссылка
Автор решения: Alex R.

Все таки это задача на использование групповых функций. Вот запрос который выдаст для каждого пользователя последнее сообщение для конкретного отправителя:

select
  max(t.id) max_id
from messges_tables t
where t.to_user_id = 1
group by t.from_user_id

Групповые функции работают на наборах строк с одинаковыми значениями (определяется в group by), чтобы выдать один результат на группу. К групповым функций относятся AVG, MIN, MAX и т.д.

→ Ссылка