MySQL: показывать последние сообщения в INBOX по одному на пользователя

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

Я попробовал GROUP BY, но результаты неточны. Некоторые последние сообщения не отображаются и не сортируются по дате последнего разговора.

Вот моя структура базы данных:

+-----------------------------------------------------------------------------------+
|                                  users_messages                                   |
+-----------------------------------------------------------------------------------+
| message_ID | sender |receiver| date | subject | body | unread | delete1 | delete2 |
+-----------------------------------------------------------------------------------+

+---------------------+
|        members      |
+---------------------+
| id | username | ... 
+----+----------+-----+

Вот мой текущий запрос:

$result = $DB->query("SELECT p.*, p.sender as sender, m.*
FROM  " . DB_PREFIX . "messages p
LEFT JOIN " . DB_PREFIX . "members m ON p.sender=m.member_id
WHERE p.receiver='" . $SESSION->conf['member_id'] . "' AND delete2=0
GROUP BY p.sender ORDER BY p.senddate DESC
LIMIT " . (($page - 1) * $PREFS->conf['per_page']) . ", " . $PREFS->conf['per_page']);

person Jenny    schedule 04.01.2013    source источник
comment
@Joddy: есть два отдельных поля идентификатора пользователя, простого GROUP BY будет недостаточно.   -  person Kaivosukeltaja    schedule 04.01.2013
comment
@Kaivosukeltaja - Но получатель (тип идентификатора пользователя 2) исправлен. теперь остается только одна переменная — отправитель (тип идентификатора пользователя 1). Так что, GROuP BY на p.sender не решит проблему?   -  person Joddy    schedule 04.01.2013
comment
нет, это не работает. я пробовал пару раз.   -  person Jenny    schedule 04.01.2013
comment
@Joddy: Нет, OP хочет получать сообщения либо от, либо для текущего пользователя. Текущий запрос получает только последние.   -  person Kaivosukeltaja    schedule 04.01.2013
comment
@Kaivosukeltaja - Хорошо, понял, раньше не совсем понял проблему и связанное с ней объяснение.   -  person Joddy    schedule 04.01.2013
comment
я обновил вопрос. чтобы вы поняли, чего я пытаюсь достичь.   -  person Jenny    schedule 04.01.2013


Ответы (1)


SELECT t1.*, t2.*
FROM 
  users_messages AS t1
LEFT JOIN members AS t2
  ON t1.sender = t2.id
LEFT JOIN users_messages AS t3
  ON t1.sender = t3.sender AND t1.receiver = t3.receiver 
    AND t1.message_ID < t3.message_ID
WHERE (t1.sender = @userid OR t1.receiver = @userid) AND t3.message_ID IS NULL

Я не проверял, поэтому, возможно, допустил оплошность, но один из вариантов: вы можете выполнить самосоединение user_messages для отправителя и получателя и t1.message_ID ‹ t3.message_ID. Поскольку самое последнее сообщение между парой из t1 не имеет кандидатов на соединение в t3 и является левым соединением, столбцы t3 будут нулевыми, и вы можете выбрать это в предложении where, чтобы получить самое последнее.

person Community    schedule 04.01.2013