Диалоги с последним сообщением из базы данных MySQL

При разработке сайта с функционалом социальной сети на странице сообщений (например, как в ВКонтакте) мы должны выводить список диалогов с пользователем. При клике на диалог — открывается сама переписка. Давайте разберёмся, как группировать сообщения в диалоги и выводить их в нашем разделе сообщений.

Именно с выводом этого списка диалогов очень часто возникают сложности, ведь диалог — это по сути выборка всех сообщений к пользователю, сгруппированных по отправителю и отсортированных по убыванию даты (или id записи, если записи добавляются на страницу последовательно). Логика не из самых лёгких, особенно для неопытных программистов.

Здесь я хочу привести пример MySQL запроса, который и вернёт нам список именно диалогов, а не всех сообщений.

Группировка в диалоги. Структура таблицы.

Допустим, у нас есть в базе данных табличка messages, где мы храним все наши сообщения.

В табличке у нас имеются следующие поля:

  1. id_message (id сообщения)
  2. uid_from (id отправителя)
  3. uid_to (id получателя
  4. text (cам текст сообщения)
  5. created_at (дата отправления сообщения)

Это минимальная структура таблицы с сообщениями, которой нам вполне хватит, чтобы реализовать список диалогов.

Сообщения в MySQL. Группировка в диалоги

Допустим, user_id пользователя, для которого мы будем выводить список диалогов равен 2.

Далее, допустим, user_id с номером 2 общается с пользователями с user_id 100, 293, 14, 34 и 7. В этом случае мы получаем 5 диалогов, при клике на которые нам раскроется история сообщений с каждым конкретным собеседником. Задачка вполне типичная для обычного сервиса где постоянно идёт общение пользователей между собой.

SQL запрос. Группируем диалоги.

В этом случае список всех диалогов, отправленных нашим user_id к другим пользователям (то есть конкретный пользователь выступает как отправитель) вернёт следующий запрос:


Если же нам нужно получить список диалогов, отправленных разными пользователями нашему user_id ( то есть user_id = получатель), то запрос чуток сократится:

Таким образом мы получаем список именно диалогов, сгруппированных по отправителю или получателю.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *