试图重新创建一个类似于facebook现在设置的私有消息系统。im有问题的部分是按时间戳顺序从不同线程中选择最新消息。
这是迄今为止我能想到的最接近的问题。问题是收件箱应该只为每个线程返回一行,而当前我的查询从同一线程返回多行:

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,如果它可以简化我的查询并完成工作,那么im将打开以更改我的表。下面是对我的表格/收件箱规格的更详细的解释。
具体来说:
*任何两个用户之间的消息都发生在一个正在进行的线程上。任何两个用户之间的所有消息只是一个正在进行的会话(线程)的延续,即使两个用户都删除了彼此之间的所有以前的消息,任何将来的消息仍将出现在同一个线程上。
*按邮件id跟踪单个邮件。
*每个线程在任何给定时间只在收件箱中显示一次,并将显示该线程的最新消息。
*将在同一收件箱中显示正在接收和发送的收件箱和发件箱邮件,而不是收件箱。
因此,如果im用户A和我在20分钟前还没有从用户B读到消息,我会回复用户C昨天(10分钟前)发送给我的消息,而用户D在2分钟前发送给我的另一条消息,我的收件箱应该是这样的:
用户D的线程-显示用户D发送给我的消息。
用户C的线程--显示发送给用户C的消息
用户B的线程-显示用户B发送给我的消息
*显示的线程将按最新到最旧排序。

最佳答案

    SELECT * FROM
        (SELECT * FROM messages ORDER BY created_at DESC) messages
    GROUP BY IF(from_user_id < to_user_id, CONCAT_WS('_', from_user_id, to_user_id), CONCAT_WS('_', to_user_id, from_user_id));

09-10 11:42
查看更多