【问题标题】:conversation type inbox messages between two users for a website一个网站的两个用户之间的对话类型收件箱消息
【发布时间】:2019-02-13 10:49:27
【问题描述】:

我想实现两个用户之间的对话类型收件箱消息,其中对话将在两个用户之间分组并显示在收件箱页面上,当单击对话时,将显示两个用户之间的整体聊天记录... . 我有一个数据库架构,但未能对两个用户之间的对话进行分组。我需要一个查询来实现这一点谢谢 这是我的桌子。

1.用户:

  • 身份证
  • 用户名
  • 密码

2.对话:

  • conversation_id
  • from_user
  • to_user

3.消息:

  • message_id
  • conversation_id
  • user_id
  • message_text
  • message_date
  • 看到

因此,如果有人知道如何实现此查询,那么请帮助我,也将不胜感激更改我的架构,谢谢

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:
    SELECT conversation FROM
            conversations
    
    WHERE (conversations.from_user = <user parameter>
    OR conversations.to_user = <user parameter>) 
    AND conversations.from_user <> conversations.to_user
    

    【讨论】:

    • 我目前有两个对话,在每个对话中两个用户正在对话.. 我想要的是根据其他用户的用户名对当前用户参与的对话进行分组,但您的查询返回四个记录包括当前用户本身,但我喜欢让它像 facebook messager 那样分组
    • 不清楚你的目标是什么。您在其他 cmet 中说过您只需要用户名,但在这里您说您要对对话​​进行分组。这两件事将有不同的查询来提供数据。请确定其中哪些是要求
    • 我想将当前用户正在与之交谈的用户的用户名上的消息分组,就像我想要实现的 facebook messanger 一样
    • 不,先生,您没有听我解释……假设我们有 4 个用户和 3 个对话……在对话 1 中,用户 1(史密斯)正在与用户 2(约翰)对话,在对话 2 中,用户 2 (john) 正在与 user3(michael) 交谈,并且在会话 3 中 user1(smith) 正在与 user3(michael) 交谈,因此当 user1 登录到他的帐户时,他的收件箱中将有两个对话,一个名为 john,另一个名为迈克尔等等......这就是我想要的
    • 如果 user1 与 user2 有多次对话怎么办?您想在结果、用户名或两者中获取对话 ID?
    【解决方案2】:

    您可以使用如下所示的查询通过对话获取当前用户与最后一条消息的所有对话:

    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
    

    附:您必须将&lt;current_user_id&gt; 替换为当前用户的实际标识符

    【讨论】:

    • 我没有得到你的答案,这也是一种复杂的先生,给我一个错误..我想要实现的是列出不包括该人与之对话的用户名,你能详细说明一下吗谢谢
    • 您只需要用户名吗?
    • 我在回答中添加了新的问题
    • "#1064 - 您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,了解在 'AS t LEFT JOIN users ON users.id = t 附近使用的正确语法.intercolutor_id LIMIT 0, 25' at line 9" 这是查询给我的错误
    • 您是否将&lt;current_user_id&gt; 替换为当前用户的实际标识符?你确定用户标识符的列名是'id'吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多