2009-10-02 1 views
0

У меня есть MySQL таблицы, содержащие сообщения:MySQL: Создание списка разговоров (последние сбще в/из user_id)

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

Мне нужно получить список самого последнего пользователя сообщений X, полученные от или отправить другими (отдельными) пользователями.

Другими словами, я хотел бы создать полный список разговоров с другими пользователями, отсортированных по отправленному сообщению последнего сообщения, обмениваемого с данным пользователем. Конечный результат (обрабатывается в 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

Я бы посоветовал код, приведенный в сообщении Codeburger, но добавив, что у вас есть другие возможности (так как это похоже на то, что его код не является чем-то новым в отношении решения).

Возможные варианты включают в себя:

  1. индексацию как на sender_id (INT) и recipient_id (INT) для увеличения времени поиска

  2. создать отдельную таблицу для каждого sender_id (таким образом, когда вы знаете, который беседует между ними - при условии, что это всего лишь разговор 1 на 1 - вы можете просто извлечь из двух таблиц, где идентификаторы являются общими)

, моя любимая идея, создайте дополнительный столбец, который ссылается на базу данных транзакций и хранит историю каждой транзакции, индексируется номер разговора ... вероятно, это «худшее», но это скорее мой организационный стиль.

если у вас есть какие-либо вопросы, я могу уточнить, на самом деле, я, вероятно, обновить это позже, когда я возвращаюсь домой

+0

Или вариант третьего варианта - создайте дополнительный столбец, содержащий идентификатор первой строки беседы. Таким образом, мы могли бы сделать SELECT * WHERE sender_id = '$ uid' ИЛИ ​​recipient_id = '$ uid' GROUP BY first_id ORDER BY sent_date DESC. Эй, еще лучше - я могу добавить еще один столбец, содержащий последовательный номер данного сообщения в разговоре между этими двумя пользователями. Пока нет удалений, он должен работать достаточно хорошо.:) Любые мысли по этому поводу? – Mike

+0

просто удалите ваши обновления таблиц ... индексирование CRUCIAL в этом, хотя очень важно ... я работаю с большим количеством транзакций, и все это помогло мне – parkman47

+0

Я бы даже не подумал об этом без индексации , Огромная, огромная разница, я знаю. :) Спасибо большое! – Mike

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, вам придется сделать новую таблицу для разговоров, или работать логик, регулирующее то, что делает набор сообщений попадают в конкретный разговор.

+0

Да, но это означает, что я должен был бы получить все сообщения от конкретного пользователя каждый время он смотрит на свой почтовый ящик, который я бы хотел избежать, если возможно, дать серверу перерыв. Я пытался создать запрос с UNION и DISTINCT, но потерялся на этом пути. Другой способ, о котором я думал, - получить самые новые сообщения в нескольких запросах, а затем объединить массивы в php, но потом мне придется сортировать многомерный массив после этого, и я все равно буду извлекать что-то вроде двух раз больше строк, чем необходимо. :/ – Mike

Смежные вопросы