【问题标题】:MySQL: Creating a list of conversations (last msgs to/from user_id)MySQL:创建对话列表(发往/发自 user_id 的最后一条消息)
【发布时间】:2009-10-02 22:51:23
【问题描述】:

我有一个包含消息的 mysql 表:

id (INT)
sender_id (INT)
recipient_id (INT)
sent_time (INT)
read_time (INT)
body (TEXT)

我需要检索用户 X 从其他(不同)用户接收或发送给其他(不同)用户的最新消息列表。

换句话说,我想创建与其他用户的完整对话列表,按与给定用户交换的最后一条消息的 sent_time 排序。 最终结果(用 PHP 处理)会像这样:

array (
    array (other_user_1_id, last_msg_sent_time, last_msg_is_read,
           last_msg_is_to_me/from_me, number_of_messages*),
    array (other_user_2_id, ... )
)

*) number_of_messages 是可选的,但很高兴拥有。

问题:我怎样才能最有效地做到这一点?创建一个单独的“对话”表并在每次有人发送或阅读消息时更新它,或者在“消息”表上创建一个单一但复杂的查询?如果是后者,查询会是什么样子?

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    我会接受 codeburger 帖子中给出的代码的建议,但要补充一点,您还有其他选择(因为听起来他的代码在解决方案方面并不是什么新东西)。

    可能的选项包括:

    1. 同时为 sender_id (INT) 和 recipient_id (INT) 编制索引以增加搜索时间

    2. 为每个 sender_id 创建一个单独的表(这样,当您知道对话的对象是谁时 - 假设它只是一对一对话 - 您可以从 id 常见的两个表中提取)

    3,我最喜欢的想法,创建一个引用事务数据库的附加列并保留每个事务的历史记录,从对话编号中索引...在某些方面它可能是“最糟糕的”,但它更像是我的组织风格.

    如果您有任何问题,我可以详细说明,事实上,我回家后可能会更新此内容

    【讨论】:

    • 或第三个选项的变体 - 创建包含对话第一行 id 的附加列。这样我们可以执行 SELECT * WHERE sender_id = '$uid' OR recipient_id = '$uid' GROUP BY first_id ORDER BY sent_date DESC。嘿,更好 - 我可以再添加一列,其中包含这两个用户之间对话中给定消息的序号。只要没有删除,它应该工作得很好。 :) 对此有什么想法吗?
    • 只是让您的删除更新表格...不过,索引在这方面很重要,非常非常重要...我确实处理大量事务,这对我有帮助
    • 如果没有索引,我什至不会考虑这样做。巨大的,巨大的差异,我知道。 :) 非常感谢!
    【解决方案2】:

    类似的东西:

    $id = 12345 // Id for the user you are pulling messages for
    $messages = Array();
    
    $result = mysql_query("SELECT sender_id, recepient_id, sent_time, read_time FROM messages WHERE sender_id = $id OR recepient_id = $id");
    
    while ($row = mysql_fect_assoc($result)) {
    
      $directon = ( $row['recepient_id'] == $id ) ? 'to' : 'from';
      $isRead = ( (bool)$row['read_time'] );
      ....
      ....
      $messages[] = Array( $direction, $isRead .......... )
    
    }
    

    对于 convo 中的消息数量,您必须为对话创建一个新表,或者制定一个逻辑来控制使一组消息落入特定对话的逻辑。

    【讨论】:

    • 是的,但这意味着我必须在给定用户每次查看他的邮箱时检索他的所有消息,如果可能的话,我想避免给服务器一个休息。我试图用 UNION 和 DISTINCT 创建一个查询,但在此过程中迷路了。我正在考虑的另一种方法是在几个查询中获取最新消息,然后在 php 中组合数组,但是之后我必须对多维数组进行排序,而且我仍然会检索两倍的行数需要。 ://
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多