试图重新创建一个类似于 Facebook 近来设置的私人消息系统。我遇到问题的部分是仅选择来自不同线程的最新消息,按时间戳排序。
这是迄今为止我能想到的最接近的查询。问题是收件箱应该只为每个线程返回一行,目前我的查询从同一个线程返回多行:
SELECT m.created_on, m.thread_id, m.message_id, m.created_by, m.body, u.first_name, u.last_name, u.thumb_img
FROM pms_messages AS m, pms_recips AS r, users AS u
WHERE r.uid =19
AND r.status
IN ('A', 'N'
)
AND r.thread_id = m.thread_id
AND (SELECT max(r.message_id)) = m.message_id
AND m.created_by = u.uid
ORDER BY created_on DESC
这是我当前数据库设置的 img,如果它可以简化我的查询并完成工作,我愿意对我的表进行更改。再往下是对我的表格/收件箱规格的更详细说明。
更具体:
*任何两个用户之间的消息都发生在一个正在进行的线程上。任何 2 个用户之间的所有消息只是一个正在进行的对话(线程)的延续即使两个用户都删除了彼此之间的所有先前消息,任何未来的消息仍然会出现在同一个线程上。
*单个消息由 message_id 跟踪。
*每个线程在任何给定时间仅在收件箱中显示一次,并将显示该线程的最新消息。
*接收和发送的邮件将显示在同一个收件箱中,而不是收件箱和发件箱。
因此,如果我的用户 A 和我有一条消息我还没有从用户 B-20 分钟前阅读,我回复了用户 C 昨天 - 10 分钟前发送给我的一条消息,而来自用户 D 的另一条消息 - 2 分钟前我的收件箱应该看起来像这样:
带有用户 D 的线程 - 显示用户 D 发送给我的消息。
带有用户 C 的线程 - 显示我发送给用户 C 的消息
与用户 B 的线程 - 显示用户 B 发送给我的消息
*正在显示的线程将按从最近到最旧的顺序排序。