在mysql中,按用户分组从表中查找最新的消息。

8 浏览
0 Comments

在mysql中,按用户分组从表中查找最新的消息。

我网站上有一个私信表,一段时间以来,我一直有一个收件箱和发件箱分开。我想要合并收件箱/发件箱,只显示与特定用户之间的最新消息。

示例表格

|  id | fromuser | fromid | touser | toid | message    |  timestamp            |
--------------------------------------------------------------------------------
|  1  | user1    |  1     | user2  |  2   | 你好...    |  2015-01-01 00:00:00  |
|  2  | user1    |  1     | user3  |  3   | 好的...    |  2015-01-02 00:00:00  |
|  3  | user3    |  3     | user1  |  1   | 不是....    |  2015-01-03 00:00:00  |
|  4  | user2    |  2     | user3  |  3   | 新的....    |  2015-01-04 00:00:00  |
|  5  | user2    |  2     | user1  |  1   | 附上.....  |  2015-01-05 00:00:00  |
--------------------------------------------------------------------------------

我想要的结果是当用户为1时

|  id | fromuser | fromid | touser | toid | message    |  timestamp            |
--------------------------------------------------------------------------------
|  3  | user3    |  3     | user1  |  1   | 不是....    |  2015-01-03 00:00:00  |
|  5  | user2    |  2     | user1  |  1   | 附上.....  |  2015-01-05 00:00:00  |
--------------------------------------------------------------------------------

使用下面的代码,我可以让它显示与每个用户之间的一条消息,但它显示的是最旧的消息而不是最新的。

mysql_query("SELECT m1.*, users.id AS userid, users.username 
    FROM pm AS m1, pm AS m2, users 
    WHERE ((m1.fromuser='".$_SESSION['userName']."' AND users.id=m1.toid) 
    OR (m1.touser='".$_SESSION['userName']."' AND users.id=m1.fromid)) 
    AND m2.id=m1.id ORDER BY timestamp DESC");

0
0 Comments

问题的出现原因:

- 第一段代码中的查询语句使用了not exists子查询来查找最新的消息,按用户分组。然而,该查询存在一些问题,导致返回了多个相同发送者的消息,而不是每个用户的最新消息。

解决方法:

- 第一段代码中的查询语句可以改进。第二段代码中的查询语句使用了left join和is null来找到每个用户的最新消息。

以下是改进后的查询语句:

select m.* 
from messages m 
left join messages m2 
on ((m.fromuser = m2.fromuser and m.touser = m2.touser) 
    or (m.fromuser = m2.touser and m.touser = m2.fromuser)) 
    and m.timestamp < m2.timestamp 
where (m.fromuser = 'user1' or m.touser = 'user1') 
and m2.id is null;

这个查询语句通过left join将消息表与自身连接,根据时间戳比较找到每个用户的最新消息。

0