Вы можете получить все разговоры текущего пользователя с последним сообщением через разговор, используя запрос, который выглядит следующим образом:
SELECT users.id,
users.name,
messages.conversation_id,
messages.message_id,
messages.message_text,
messages.message_date,
messages.seen
FROM
(SELECT conversations.conversation_id,
IF(conversations.from_user = <current_user_id>, conversations.to_user, conversations.from_user) AS interlocutor_id,
max(messages.message_id) AS last_message_id
FROM conversations
LEFT JOIN messages ON conversations.conversation_id = messages.conversation_id
WHERE convesations.from_id = <current_user_id>
OR conversations.to_id = <current_user_id>
GROUP BY conversations.conversation_id) AS t
LEFT JOIN users ON users.id = t.intercolutor_id
LEFT JOIN messages ON messages.message_id = t.last_message_id
Если вам нужно получить все разговоры текущего пользователя с последними индокс-сообщениями, используя:
SELECT users.id,
users.name,
messages.conversation_id,
messages.message_id,
messages.message_text,
messages.message_date,
messages.seen
FROM
(SELECT conversations.conversation_id,
IF(conversations.from_user = <current_user_id>, conversations.to_user, conversations.from_user) AS interlocutor_id,
max(messages.message_id) AS last_message_id
FROM conversations
LEFT JOIN messages ON conversations.conversation_id = messages.conversation_id
WHERE (convesations.from_id = <current_user_id>
OR conversations.to_id = <current_user_id>)
AND messages.user_id <> <current_user_id>
GROUP BY conversations.conversation_id) AS t
LEFT JOIN users ON users.id = t.intercolutor_id
LEFT JOIN messages ON messages.message_id = t.last_message_id
Но я думаю, что лучше, если вы переписываете схему базы данных и добавляете идентификатор последнего сообщения в таблицу «разговоров». Это сделает запрос более оптимальным
ОБНОВЛЕНИЕ:
Если вам нужно получить список всех пользователей, которые общаются с текущим пользователем:
SELECT t.conversation_id,
users.id,
users.name
FROM
(SELECT conversation_id,
IF(from_user = <current_user_id>, to_user, from_user) AS interlocutor_id
FROM conversations
WHERE from_id = <current_user_id>
OR to_id = <current_user_id>) AS t
LEFT JOIN users ON users.id = t.intercolutor_id
P.S. Вы должны заменить <current_user_id>
на фактический идентификатор текущего пользователя