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

Изображение к вопросу
  • 29 августа 2023 г. 14:56
Ответы на вопрос 2
Чтобы лучше спланировать структуру таблицы для хранения данных чата, вам следует учесть следующие факторы:

1. Таблица "messages": Создайте таблицу для хранения сообщений чата с колонками, включающими идентификатор сообщения, идентификатор отправителя, идентификатор получателя, текст сообщения, дату и время отправки.

2. Таблица "users": Создайте таблицу для хранения данных пользователей, включая идентификатор пользователя, логин, пароль и другую информацию по желанию.

3. Таблица "image": Создайте таблицу для хранения изображений, связанных с пользователями или сообщениями. Добавьте колонки для идентификатора объекта (пользователя или сообщения), типа объекта (user или message) и путь к изображению.

4. Указатель "last_message_id": В таблице пользователей добавьте поле "last_message_id", которое будет хранить идентификатор последнего сообщения, отправленного или полученного пользователем.

Теперь, касательно запроса, чтобы вывести последнее сообщение в блоке слева на картинке, вам необходимо изменить ваш запрос. Одна из возможных вариаций такая:

SELECT
    m.*,
    u.login,
    i.img
FROM
    messages m
INNER JOIN 
    users u ON m.from_user_id = u.id
INNER JOIN 
    image i ON m.from_user_id = i.obj_id AND i.obj_type = 'user'
WHERE
    (m.from_user_id = :id OR m.to_user_id = :id)
    AND m.id = (
        SELECT 
            MAX(id) 
        FROM 
            messages 
        WHERE 
            (from_user_id = :id OR to_user_id = :id)
    )
ORDER BY 
    m.date DESC
LIMIT 1

В этом запросе мы используем INNER JOIN для объединения таблиц messages, users и image. Затем фильтруем сообщения, чтобы они соответствовали выбранному пользователю с помощью условия (m.from_user_id = :id OR m.to_user_id = :id). Затем мы выбираем только последнее сообщение с помощью подзапроса, который находит максимальное значение id в таблице messages. Затем сортируем результаты по дате в порядке убывания и ограничиваем вывод одной строкой с помощью LIMIT 1.

Этот запрос должен вернуть последнее сообщение, отправленное или полученное выбранным пользователем, которое можно использовать для вывода в блоке слева на картинке.
Выберите сообщение из списка сообщений, где идентификатор отправителя равен $user_id или $peer_id, и идентификатор получателя также равен $user_id или $peer_id. Отсортируйте их по дате в порядке убывания и выберите только одно сообщение.
Похожие вопросы