簡體   English   中英

網站的兩個用戶之間的對話類型收件箱消息

[英]conversation type inbox messages between two users for a website

我想實現兩個用戶之間的對話類型的收件箱消息,其中對話將在兩個用戶之間分組並顯示在收件箱頁面上,當單擊對話時,總體聊天記錄將顯示在兩個用戶之間....數據庫模式,但未能對兩個用戶之間的對話進行分組。我需要一個查詢來實現此目的。謝謝,這是我的表。

1. 用戶:

  • ID
  • 用戶名
  • 密碼

2. 對話:

  • conversation_id
  • FROM_USER
  • to_user

3. 消息:

  • MESSAGE_ID
  • conversation_id
  • 用戶身份
  • MESSAGE_TEXT
  • MESSAGE_DATE
  • 看到

因此,如果有人知道如何實現此查詢,那么也請幫助我更改我的架構,謝謝

您可以使用如下所示的查詢,通過對話獲得當前用戶的所有對話以及最后一條消息:

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

如果需要,請使用以下命令獲取當前用戶與上一次indox消息的所有對話:

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

但是我認為,如果您要重寫數據庫方案並在“對話”表中添加最后一條消息的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

PS您必須將<current_user_id>替換為當前用戶的實際標識符

SELECT conversation FROM
        conversations

WHERE (conversations.from_user = <user parameter>
OR conversations.to_user = <user parameter>) 
AND conversations.from_user <> conversations.to_user

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM