На примере Вк/Фб диалогов используется 2 таблицы
1 Диалог
2 Сообщения
Для личной переписки хватает 1 таблицы но я предпочитаю использовать 2
Переписка сообщения в рамках 1 таблицы ( ps этот же запрос используется для чека диалогов )
SELECT *
FROM message
WHERE
(user_one='11' AND user_two='16')
OR
(user_one='11' AND user_two='13')
=====================
Тот же подход только в 2 таблицы диалоги/переписка как в вк фб.
Между пользователями может быть только 1 диалог кто первый написал сообщение того и тапки)
Контролировать дубликаты диалогов придется на уровне приложения это скажем небольшой минус.
Мои диалоги с пользователями
set @user_id=11;
SELECT id, last_message_id, update_at, user_one, user_two FROM message_dialog
where user_one =@user_id or user_two=@user_id;
для открытия переписки мы из списка выбрали скажем диалог, получили ИД переписки например диалог в системе с id 5
Получаем переписку
set @dialog_id=5;
select id, dialog_id, user_id, message, created_at, etc from dialog_message where dialog_id=@dialog_id order by id desc