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

时间:2013-05-10 16:48:26

标签: php mysql node.js

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

enter image description here

这是我当前的数据库结构和一些示例数据: 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

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

干杯,

乔尔

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,但这只有在保证对这些用户唯一的情况下才有效。