1

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

在此处输入图像描述

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

我能做些什么呢?希望我不必对数据库设计进行任何重大更改。任何帮助是极大的赞赏。

干杯,

乔尔

4

2 回答 2

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 ║
╚════╩═══════════╩═══════════╩═════════════════╩════════════╩══════╝
于 2013-05-10T16:56:30.787 回答
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,但只有在可以保证对这些用户来说是唯一的情况下才有效。

于 2013-05-10T17:07:07.240 回答