我正在尝试重建现有的消息传递系统,因此它看起来类似于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
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
第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
这就是我被困住的地方......问题是,将显示两个用户之间的对话中发送的第一条消息,而不是最近的消息:http://sqlfiddle.com/#!2/942fb/2
我该怎么办?希望我不必进行任何重大的数据库设计更改。任何帮助是极大的赞赏。
干杯,
乔尔
答案 0 :(得分: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
);
输出
╔════╦═══════════╦═══════════╦═════════════════╦════════════╦══════╗
║ 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 ║
╚════╩═══════════╩═══════════╩═════════════════╩════════════╩══════╝
答案 1 :(得分:1)
假设我已经理解正确,并且您正在寻找用户1和2之间的最新消息,那么这是一种方法。
SELECT * FROM uc_user_messages
WHERE id = (
SELECT MAX(id) FROM uc_user_messages
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1
)
这依赖于id
正在提升,这可能不是一个好主意。另一种方法是使用timestamp
,但这只有在保证对这些用户唯一的情况下才有效。