MySQL:每个用户在INBOX中显示最后一条消息

时间:2013-01-04 07:06:38

标签: mysql messages

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

1 个答案:

答案 0 :(得分: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

我没有经过测试,所以可能会进行疏忽但是一个选项是你可以在发送者和reciver上执行user_messages自我加入,并且t1.message_ID&lt; t3.message_ID。因为来自t1的对中的最近消息在t3中没有连接候选,并且它是左连接,所以t3列将为空,您可以在where子句中为此选择以获得最新的。