我搜索了类似的主题,但要么它们似乎不适合我的场景,要么我无法适应我的代码。
我想要实现的是获取最后一条消息(由成员发送或由成员接收),相应的成员(也称为其他成员)以及其他一些字段,以提供对话的摘要在代码中看到。我的问题是,一些成员有100多条消息,我的查询当前设置为循环遍历或来自成员的所有消息,这正在减慢一些事情。我问你建议重写我的查询,以便我只获取我想要的东西(一个[其他]成员,一个消息等),如果可能的话,这两个成员之间的消息计数。谢谢!
$msg_prev_count = 120;
$q = mysql_query("SELECT `m`.`id`, `m`.`from`, `p`.`username`, `m`.`to`, UNIX_TIMESTAMP(`p`.`last_seen`) AS `last_seen`, SUBSTRING(`m`.`message`,1,{$msg_prev_count}) AS `message`, `m`.`photo_attachment`, UNIX_TIMESTAMP(`m`.`time`) AS `time`, `m`.`read`, `m`.`replied`
FROM `messages` `m`, `profiles` `p`
WHERE `p`.`status`=1 AND `m`.`box`='inbox'
AND ((`m`.`to`={$_SESSION['member_id']} AND `p`.`id`=`m`.`from`)
OR (`m`.`from`={$_SESSION['member_id']} AND `p`.`id`=`m`.`to`))
ORDER BY `m`.`time` DESC") or die ("error fetching messages: ".mysql_error());
这就是我目前整理邮件并一个一个地丢弃的方法!
while ($m = mysql_fetch_assoc($q)) {
clear4html($m);
split_long_words($message['message']);
$other_member_id = ($m['from'] == $_SESSION['member_id'])?$m['to']:$m['from'];
if (!is_array($msg[$other_member_id])) {
$msg[$other_member_id]['msg_count'] = 1;
$msg[$other_member_id]['time'] = $message['time'];
foreach ($m as $f => $v) $msg[$other_member_id][$f] = $v;
}
else $msg[$other_member_id]['msg_count']++;
}