MySQL: konuşmaların bir listesini (son msj için / user_id itibaren) oluşturma

2 Cevap php

Ben iletileri içeren bir mysql tablo var:

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

Ben X alınan veya başka (farklı) kullanıcılara gönderilen en son mesajlar kullanıcı listesini almak gerekiyor.

In other words I'd like to create a full list of conversations with other users, sorted by sent_time of last message exchanged with a given user. The end result (processed in PHP) is going to like like this:

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 isteğe bağlı, ama olması oldukça güzel.

Soru: Bunu nasıl en verimli şekilde yaparsınız? Ayrı bir tablo "konuşmaları" oluşturma ve güncellemek her kimse gönderir veya okuyan bir mesaj ya da bir tek oluşturmak zaman, ama "mesajlar" masada sofistike sorgu? Ikincisi ise, sorgu neye benzer ki?

2 Cevap

Ben codeburger gönderimizde verilen kod tavsiye alacaktı ama (onun kod bir çözüm getirmedi yeni bir şey değil gibi geliyor) diğer seçenekleri olduğunu eklemek.

Olası seçenekleri şunlardır:

  1. sender_id (INT) ve recipient_id hem indeksleme (INT) arama süresini artırmak için

  2. (Eğer konuşma arasında kim olduğunu biliyorum bu şekilde - sadece bir 1 1 konuşma olduğunu varsayarak - sadece kimlikleri ortak olan iki tablodan indirebiliriz) Her sender_id için ayrı bir tablo oluşturmak

3, benim en sevdiğim fikir bir işlem veritabanı başvuran bir ek sütun oluşturmak ve her bir işlem geçmişini tutmak, konuşma sayıda kapalı endeksli ... muhtemelen bazı yollarla "kötü", ama benim örgütsel tarzı daha fazla bulunuyor.

Herhangi bir sorunuz varsa, ben eve bir kez olsun aslında, ben muhtemelen bu daha sonra güncelleme olacak, detaylandırabileceğiniz

Bu satırlar boyunca bir şey:

$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 .......... )

}

Bir münazara iletilerin sayısı için, sen konuşmaları için yeni bir tablo yapmak zorunda, ya da mesajları bir dizi belirli bir konuşma içine düşmek kılan yöneten bir mantık çalışacaktır.