我有一个包含消息的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
是可选的,但很高兴。
问题:如何最有效地完成这项工作?创建一个单独的表“对话”并在每次有人发送或读取消息或在“消息”表上创建单个但复杂的查询时更新它?如果是后者,查询会是什么样的?
答案 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帖子中给出的代码的建议,但是为了增加你有其他选择(因为听起来他的代码对于解决方案来说并不是什么新东西。)
可能的选项包括:
对sender_id(INT)和recipient_id(INT)进行索引以增加搜索时间
为每个sender_id创建一个单独的表(当你知道对话之间的对话时 - 假设它只是一对一的对话 - 你可以从两个表中拉出常见的表)
3,我最喜欢的想法,创建一个引用事务数据库的附加列,并保留每个事务的历史记录,从会话编号索引...在某些方面可能是“最差”,但它更多是我的组织风格
如果你有任何问题,我可以详细说明,事实上,我可能会在我回家后更新这个