3

一个对话包含消息,一条消息可以发送给 2 个或更多用户。

目标是按用户检索每个对话的最后一条消息,因此每个对话中的消息都是最新的。

还有message_user.time就是当用户已经阅读了消息,所以当它等于0时,这意味着消息还没有被阅读,所以如果第一个顺序是时间等于0的message_user和消息,那就更好了.time 是最大的数字。

我有那些桌子

留言用户

user   message      time   
-----|------------|-------
 7   | 1          | 0
 8   | 1          | 0
 7   | 2          | 300
 8   | 2          | 300
 7   | 3          | 400

信息

id    text         conversation   time
---|-------------|--------------|----------
1  | blah blah1  | 1            | 200
2  | blah blah2  | 1            | 300
3  | blah blah3  | 2            | 400
4  | blah blah4  | 2            | 500

目标是按对话对消息进行分组,然后获取链接到该对话的最后一个 message_user,该对话首先具有较大的时间戳。

我试过的是这个,但我没有收到最后一条消息(错误的顺序)

    SELECT m.user, mu.message, mu.time, mu.id, m.text, m.time as message_time, m.conversation
    FROM message_user as mu,message as m 
    WHERE mu.message=m.id AND mu.user=8
    GROUP BY m.conversation
    ORDER BY m.time DESC';

然后下一步将是: 我不知道是否有可能,但如果 order by 可以输出 message_user ,其中时间首先等于 0,然后第二个 order 是 message.time (我什至不知道它是否可能在一个完美的请求中!)

对于用户 8,输出应该是这样的:

text        conversation 
-----------|------------
blah blah1 | 1         //because message_user.time = 0 (means message is unread)
blah blah3 | 2         //because message.time is the highest in the conversation

谢谢 !

4

1 回答 1

4

首先,我建议重组您的表格以使其更容易,但这就是我认为您所要求的......每个对话,仅显示最后创建的转换消息,最后一次和阅读它的用户(但更喜欢未读超过这个)。

SELECT m.user as User_Sent, m.conversation, m.text, m.time as Time_Sent
, mu.id, mu.user as User_Read, mu.time as Time_Read
FROM message as m 
JOIN (
  SELECT mx.conversation, MAX(mx.time) as MaxTime 
  FROM message as mx GROUP BY mx.conversation
  ) as mx
On m.conversation = mx.conversation
And m.time = mx.MaxTime
JOIN (
  SELECT mu.message, MAX(mu.time) as MaxTime, MIN(mu.time) as MinTime 
  From message_user as mu 
  GROUP BY mu.message
) as mux
On m.id = mux.message
JOIN message_user as mu
ON m.id = mu.message
AND CASE WHEN mux.MinTime = 0 THEN mux.MinTime ELSE mux.MaxTime END = mu.time
于 2012-06-06T16:28:58.937 回答