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

Php 查询以在“线程化”视图中获取最近的消息,php,mysql,node.js,Php,Mysql,Node.js,我正在尝试重建一个现有的消息传递系统,使其看起来类似于Twitter的DM服务。目前,我只向我的用户显示未读消息,但我希望在单个“线程”中显示两个用户之间发送的消息,如下所示: 以下是我当前的数据库结构和一些示例数据: 我试图通过分解一步一步地构建查询,但我感到困惑。 以下是我已采取的步骤列表: 一,。获取两个用户之间发送的消息列表 二,。显示两个用户之间“对话”中的最后一条消息 三,。按用户id对对话进行分组显然,这将是一个用户名,在生产应用程序中包含一组连接 这就是我被困的地方。。。问题在

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

以下是我当前的数据库结构和一些示例数据:

我试图通过分解一步一步地构建查询,但我感到困惑。 以下是我已采取的步骤列表:

一,。获取两个用户之间发送的消息列表

二,。显示两个用户之间“对话”中的最后一条消息

三,。按用户id对对话进行分组显然,这将是一个用户名,在生产应用程序中包含一组连接

这就是我被困的地方。。。问题在于,将显示两个用户之间对话中发送的第一条消息,而不是最近的消息:

我能做些什么?希望我不必做任何重大的数据库设计更改。非常感谢您的帮助

干杯

乔尔

输出

╔════╦═══════════╦═══════════╦═════════════════╦════════════╦══════╗
║ 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 ║
╚════╩═══════════╩═══════════╩═════════════════╩════════════╩══════╝
输出

╔════╦═══════════╦═══════════╦═════════════════╦════════════╦══════╗
║ 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和用户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的提升,这可能不是一个好主意。另一种方法是使用时间戳,但这只有在能够保证时间戳对这些用户是唯一的情况下才有效。

假设我正确理解了您的意思,并且您正在查找用户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的提升,这可能不是一个好主意。另一种选择是使用时间戳,但只有在能够保证时间戳对这些用户是唯一的情况下,时间戳才会起作用。

我可能误解了这个问题,但OP似乎对涉及用户id号1的消息感兴趣。那么,最后一条消息和回复消息有什么关系呢?@JamesHolderness你没有误解它。只是我没有额外的条件来筛选特定的用户ID。上面的查询将显示多个用户的所有对话的最新消息。一个简单的和1在USER_ID_1中,USER_ID_2只会给出包含USER_ID=1的对话的结果哇!我从来没有想到过这一点。事实上,我只是注意到记录4中有一个输入错误,很抱歉造成混乱。我在过去几分钟一直在测试这个查询,它似乎工作得很好。我已添加和用户_ID_1!=将USER_ID_2添加到查询的末尾,这样用户就不会看到他们自己消息的两个线程,如果他们愚蠢到一开始就给自己发送消息的话!。谢谢你的帮助@JW웃 :DI可能误解了这个问题,但OP似乎对涉及用户id号1的消息感兴趣。那么,最后一条消息和回复消息有什么关系呢?@JamesHolderness你没有误解它。只是我没有额外的条件来筛选特定的用户ID。上面的查询将显示多个用户的所有对话的最新消息。一个简单的和1在USER_ID_1中,USER_ID_2只会给出包含USER_ID=1的对话的结果哇!我从来没有想到过这一点。事实上,我只是注意到记录4中有一个输入错误,很抱歉造成混乱。我在过去几分钟一直在测试这个查询,它似乎工作得很好。我已添加和用户_ID_1!=将USER_ID_2添加到查询的末尾,这样用户就不会看到他们自己消息的两个线程,如果他们愚蠢到一开始就给自己发送消息的话!。谢谢你的帮助@JW웃 :谢谢你的回答,但另一个回答似乎更适合我的需要,因为我需要得到用户之间所有消息的列表,而不仅仅是两个单独的用户。没问题。我同意另一个答案要好得多。谢谢你的回答,但另一个答案似乎更适合我的需要,因为我需要获得用户之间的所有消息列表,而不仅仅是两个单独的用户。没问题。我同意另一个答案更好。
╔════╦═══════════╦═══════════╦═════════════════╦════════════╦══════╗
║ 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 ║
╚════╩═══════════╩═══════════╩═════════════════╩════════════╩══════╝
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
)