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

Это таблица отправки сообщений. В этой таблице могут находиться больше 10000 записей. У меня например id = 1 Я бы хотел узнать, как получить последнюю запись с тем пользователем, которым я переписывался? Например с одним пользователем(3) есть записи id = 1, 4, 7. Чтобы получить последнюю запись (в данном случае id = 7) и так с каждым, одним запросом.
Ответы (2 шт):
Как то так. Запрос вернет по одной строке для пользователя 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
Все таки это задача на использование групповых функций. Вот запрос который выдаст для каждого пользователя последнее сообщение для конкретного отправителя:
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 и т.д.