2013-05-10 55 views
1

我试图重建一个现有的消息系统,使其看起来类似于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

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

干杯,

乔尔

回答

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

我可能误解了这个问题,但OP似乎对涉及user_id号码1的消息感兴趣。那么最后一条消息(“消息答复”)如何相关? – 2013-05-10 17:12:53

+0

@JamesHolderness你不会误解它。这只是我没有额外的条件来筛选特定的'User_ID'。上面的查询将显示多个用户的所有对话的最新消息。一个简单的'AND 1 IN(USER_ID_1,USER_ID_2)'将只给出包含'user_id = 1'的对话结果[这是一个DEMO](http://sqlfiddle.com/#!2/942fb/24) – 2013-05-10 17:15:11

+0

OK,I想想我现在正在做什么。我只是一个白痴。 – 2013-05-10 17:17:42

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

+0

感谢您的回答,但其他回复似乎更适合我的需求,因为我需要获取用户之间的所有消息列表,而不仅仅是2个单一用户。 – 2013-05-10 19:23:25

+0

没问题。我同意其他答案好得多。 – 2013-05-10 19:33:52