Входящие сообщения типа беседы между двумя пользователями для веб-сайта - PullRequest
0 голосов
/ 08 сентября 2018

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

1. Пользователи:

  • ID
  • имя пользователя
  • пароль

2. разговоры:

  • conversation_id
  • from_user
  • to_user

3. Сообщения:

  • message_id
  • conversation_id
  • user_id
  • message_text
  • message_date
  • видели

так что, если кто-то знает, как выполнить этот запрос, то помогите мне также внести изменения в мою схему, спасибо.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018
SELECT conversation FROM
        conversations

WHERE (conversations.from_user = <user parameter>
OR conversations.to_user = <user parameter>) 
AND conversations.from_user <> conversations.to_user
0 голосов
/ 08 сентября 2018

Вы можете получить все разговоры текущего пользователя с последним сообщением через разговор, используя запрос, который выглядит следующим образом:

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> на фактический идентификатор текущего пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...