查询以“线索”视图获取最近的消息

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

在这里输入图像描述

这是我目前的数据库结构和一些示例数据: http : //sqlfiddle.com/#!2/574e3/1/0

我已经尝试build立查询分步骤,但我很困惑。 这是我采取的步骤清单:

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

我能做些什么呢? 希望我不会做任何重大的数据库devise更改。 任何帮助是极大的赞赏。

干杯,

乔尔

 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 ); 
  • SQLFiddle演示

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 ║ ╚════╩═══════════╩═══════════╩═════════════════╩════════════╩══════╝ 

假设我已经正确地理解了你,并且你正在寻找用户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 ,但只有在可以保证这些用户唯一的情况下才能使用。