我的网站上有一个私人消息表,一段时间以来,我有一个单独的收件箱和发送框。我想合并收件箱/发送框,只显示与特定用户之间或来自特定用户的最新消息。
TLDR:我想显示按发送给或来自每个用户的最新消息分组。
表格示例
| id | fromuser | fromid | touser | toid | message | timestamp |
--------------------------------------------------------------------------------
| 1 | user1 | 1 | user2 | 2 | Hello.. | 2015-01-01 00:00:00 |
| 2 | user1 | 1 | user3 | 3 | okay... | 2015-01-02 00:00:00 |
| 3 | user3 | 3 | user1 | 1 | not.... | 2015-01-03 00:00:00 |
| 4 | user2 | 2 | user3 | 3 | New.... | 2015-01-04 00:00:00 |
| 5 | user2 | 2 | user1 | 1 | With..... | 2015-01-05 00:00:00 |
--------------------------------------------------------------------------------
我在用户 1 中寻找的结果
| id | fromuser | fromid | touser | toid | message | timestamp |
--------------------------------------------------------------------------------
| 3 | user3 | 3 | user1 | 1 | not.... | 2015-01-03 00:00:00 |
| 5 | user2 | 2 | user1 | 1 | With..... | 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");
试试这个:
选择* 从消息 M 不存在的地方 ( 选择 1 从消息 mm 其中 (mm.fromuser = m.fromuser or mm.fromuser = m.touser) AND (mm.touser = m.touser or mm.touser = m.fromuser) 和 mm.timestamp> m.timestamp ) 和 m.fromuser = 'user1' 或 m.touser = 'user1';
在这里演示。
今后,最好将两个用户之间的对话标记为特定对话,然后每条消息都属于一个对话,因此查找用户参与的对话以及与对话相关的消息信息变得更加容易。无论如何。
试试这个。呸。
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;
它可能优于not exists
版本,即使我确实设法修复了那个版本。
这个小提琴实际上有效