MySQL:创建对话列表(去往/来自user_id的最后消息)

时间:2009-10-02 22:51:23

标签: php sql mysql

我有一个包含消息的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是可选的,但很高兴。

问题:如何最有效地完成这项工作?创建一个单独的表“对话”并在每次有人发送或读取消息或在“消息”表上创建单个但复杂的查询时更新它?如果是后者,查询会是什么样的?

2 个答案:

答案 0 :(得分:0)

这些方面的东西:

$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中的消息数量,您必须为对话创建一个新表,或者制定一个逻辑来管理使一组消息落入特定对话的原因。

答案 1 :(得分:0)

我会接受codeburger帖子中给出的代码的建议,但是为了增加你有其他选择(因为听起来他的代码对于解决方案来说并不是什么新东西。)

可能的选项包括:

  1. 对sender_id(INT)和recipient_id(INT)进行索引以增加搜索时间

  2. 为每个sender_id创建一个单独的表(当你知道对话之间的对话时 - 假设它只是一对一的对话 - 你可以从两个表中拉出常见的表)

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

    如果你有任何问题,我可以详细说明,事实上,我可能会在我回家后更新这个