查询以在"线程"视图中获取最近的消息

Joe*_*phy 1 php mysql node.js

我正在尝试重建现有的消息传递系统,因此它看起来类似于Twitter的DM服务.目前我只向用户显示未读消息,但我想在一个'线程'中显示2个用户之间发送的消息,如下所示:

在此输入图像描述

这是我当前的数据库结构和一些示例数据:http: //sqlfiddle.com/#!2/574e3/1/0

我已经尝试通过分解来逐步构建查询,但我很困惑.这是我采取的步骤列表:

1.获取两个用户之间发送的消息列表

SELECT * FROM uc_user_messages
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1
Run Code Online (Sandbox Code Playgroud)

2.显示两个用户之间"对话"中的最后一条消息

SELECT * FROM uc_user_messages
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1
ORDER BY timestamp DESC
Run Code Online (Sandbox Code Playgroud)

3.通过user_id对会话进行分组(显然,这将是一个用户名,在生产应用程序中有一堆连接).

SELECT * FROM uc_user_messages
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1
GROUP BY uc_user_messages.user_id_1 AND uc_user_messages.user_id_2
ORDER BY timestamp DESC 
Run Code Online (Sandbox Code Playgroud)

这就是我被困住的地方......问题是,将显示两个用户之间的对话中发送的第一条消息,而不是最近的消息:http://sqlfiddle.com/#!2/942fb/ 2

我该怎么办?希望我不必进行任何重大的数据库设计更改.任何帮助是极大的赞赏.

干杯,

乔尔

Joh*_*Woo 5

SELECT  *
FROM    uc_user_messages
WHERE   (LEAST(user_id_1, user_id_2),GREATEST(user_id_1, user_id_2),TIMESTAMP) 
        IN 
        (
            SELECT  LEAST(user_id_1, user_id_2) AS x,
                    GREATEST(user_id_1, user_id_2) AS y,
                    max(TIMESTAMP) AS msg_time
            FROM    uc_user_messages
            GROUP   BY x, y
        );
Run Code Online (Sandbox Code Playgroud)

OUTPUT

????????????????????????????????????????????????????????????????????
? ID ? USER_ID_1 ? USER_ID_2 ?     MESSAGE     ? TIMESTAMP  ? READ ?
????????????????????????????????????????????????????????????????????
?  3 ?         1 ?         2 ? third message   ? 1366577336 ?    1 ?
?  4 ?         2 ?         0 ? a message reply ? 1366577346 ?    1 ?
????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)