Annikangl
@Annikangl
Backend developer (PHP)

Как получить список чатов для разных пользователей?

Я разрабатываю приложения чата. У меня имеются следующие таблицы в моей базе данных MySQL:

USERS:
[ id, username, email ]

CHAT_ROOMS:
[id, created_at, updated_at ]

CHAT_ROOM_USER:
[ id, user_id, chat_room_id ]

MESSAGES:
[ id, sender_id, message, created_at, updated_at ]

Как мне вывести список чатов для каждого пользователя, где в качестве заголовка чата будет имя собеседника?
Я делаю такой запрос, он мне возращает последние сообщения из чатов каждого пользователя, но как мне выводить еще и username собеседника? Мне кажется это должен быть какой-то подзапрос?

SELECT chat_rooms.id,messages.message AS 'last_message', messages.created_at FROM chat_room_user JOIN chat_rooms ON chat_room_user.chat_room_id = chat_rooms.id JOIN users ON chat_room_user.user_id = users.id JOIN messages ON chat_room_user.chat_room_id = messages.chat_room_id WHERE users.id = $user_id AND messages.id IN (SELECT MAX(messages.id) FROM messages GROUP BY messages.chat_room_id) ORDER BY messages.created_at DESC;
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
Annikangl
@Annikangl Автор вопроса
Backend developer (PHP)
Кажется, этот запрос помог решить мою проблему

SELECT chat_rooms.id,
       messages.message AS 'last_message',
       messages.created_at,
       users.username --тут будет собеседник
FROM chat_room_user
         JOIN chat_rooms ON chat_room_user.chat_room_id = chat_rooms.id
         JOIN users ON chat_room_user.user_id = users.id
         JOIN messages ON chat_room_user.chat_room_id = messages.chat_room_id
WHERE users.id <> $user_id
  AND chat_rooms.id IN (SELECT chat_room_id FROM chat_room_user WHERE user_id = $user_id)
  AND messages.id IN (SELECT MAX(messages.id) FROM messages GROUP BY messages.chat_room_id)
ORDER BY messages.created_at DESC;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@101-s
попробуй добавить после SELECT: users.username
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы