Каждый уважающий себя разработчик должен пройти путь создания своего велосипеда - мессенджера.
От простой почтовой модели данных, где в записи сообщений есть отправитель и получатель, до
модели данных, содержащий беседки (они же чаты, они же диалоги - называйте как хотите).
Но вопрос не в этом. Давайте попробуем что-то сделать с существующей моделью.
Время сообщения у нас нет - не проблема. Время летит вперед, и id увеличиваются в ту же сторону - по возрастанию. Значит id достаточно, чтобы различать, какое сообщение пришло раньше, а какое позже.
Отсутствует сущность беседки - тоже не проблема. Будем считать совокупность сообщений, где отправитель, в которых может быть как сам автор, так и собеседник, или получатель также может быть как сам автор, так и собеседник одной беседкой. Такую совокупность сообщений можно выделить условием: (m2.to_id = m.to_id and m2.from_id = m.from_id or m2.to_id = m.from_id and m2.from_id = m.to_id) - что и будет выделять сущность беседки в упрощенном виде. Для выделения всех сообщений, где участвует пользователь from_id будет выражение: :from_id in (m.from_id, m.to_id). Осталось сообразить, как составить подзапрос с count, чтобы выделить самые поздние сообщения.
Где-то такой запрос получится:
select * from messages m
where :from_id in (m.from_id, m.to_id)
and (select count(*)
from messages m2
where (m2.to_id = m.to_id and m2.from_id = m.from_id
or m2.to_id = m.from_id and m2.from_id = m.to_id)
and m2.id > m.id
) < 1
order by id desc
Если понадобится выделить сообщения одной беседки, то скорее всего будет такой запрос:
select * from messages m
where (m.to_id = :to_id and m.from_id = :from_id
or m.to_id = :from_id and m.from_id = :to_id)
order by id asc