MySQL: создание списка разговоров (последние сообщения в / из user_id) - PullRequest
0 голосов
/ 03 октября 2009

У меня есть таблица mysql, содержащая сообщения:

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

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

Другими словами, я хотел бы создать полный список разговоров с другими пользователями, отсортированный по времени send_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 голосов
/ 03 октября 2009

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

Возможные варианты:

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

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

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

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

0 голосов
/ 03 октября 2009

Что-то вроде этого:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...