1

这是我的问题,在我的收件箱中,它显示了我仅从一个用户收到的多条消息。我需要像 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']);
4

1 回答 1

0
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

我没有测试过,所以可能有疏忽,但一种选择是您可以在发送方和接收方以及 t1.message_ID < t3.message_ID 上执行 user_messages 自加入。因为来自 t1 的一对之间的最新消息在 t3 中没有候选连接,并且它是左连接,因此 t3 列将为空,您可以在 where 子句中选择此列以获取最新消息。

于 2013-01-04T23:02:12.767 回答