我正在尝试重建现有的消息传递系统,因此它看起来类似于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
我该怎么办?希望我不必进行任何重大的数据库设计更改.任何帮助是极大的赞赏.
干杯,
乔尔
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)
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |