Сообщения:
+----+---------+------------+--------+--------------+------------+
| id | message | date | status | from_user_id | to_user_id |
+----+---------+------------+--------+--------------+------------+
| 1 | ... | 1693310921 | 0 | 15 | 20 |
| 2 | ... | 1693317654 | 0 | 20 | 15 |
| 3 | ... | 1693318102 | 0 | 19 | 15 |
| 4 | ... | 1693318124 | 0 | 15 | 19 |
+----+---------+------------+--------+--------------+------------+
Юзеры:
+----+---------+
| id | login |
+----+---------+
| 15 | user1 |
| 19 | user2 |
| 20 | user3 |
+----+---------+
Тогда запрос будет примерно такой:
SELECT
m1.*,
u1.login AS from_user_login,
u2.login AS to_user_login
FROM
messages m1
JOIN
(
SELECT
LEAST(from_user_id, to_user_id) AS user1_id,
GREATEST(from_user_id, to_user_id) AS user2_id,
MAX(date) AS max_date
FROM
messages
GROUP BY
LEAST(from_user_id, to_user_id),
GREATEST(from_user_id, to_user_id)
) m2 ON LEAST(m1.from_user_id, m1.to_user_id) = m2.user1_id
AND GREATEST(m1.from_user_id, m1.to_user_id) = m2.user2_id
AND m1.date = m2.max_date
JOIN
users u1 ON m1.from_user_id = u1.id
JOIN
users u2 ON m1.to_user_id = u2.id;
Могу ошибаться,редко составляю такие громоздкие запросы.
Но суть вроде передал верно.
P.S я бы может более костыльно сделал но:
Сделать таблицу
last_msg
и писать в нее
id(unic auto),to_user,from_user,message
И просто при отправке сообщения опред юзеру обновлять данную таблицу и хранить в ней последнее сообщение всегда.А выводить по
to_user где
to_user =
id просматривающего.