MYSQL - 用户获取最后消息MAX(时间)

时间:2012-06-06 15:12:01

标签: mysql sql

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

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

同样message_user.time是当用户读取消息时所以当它等于0时,这意味着消息尚未被读取,所以如果第一个订单是message_user,那么时间会更好等于0,message.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';

然后下一步将是: 我不知道是否可能但是如果订单可以输出message_user,其中时间首先等于0,然后第二个订单是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

谢谢!

1 个答案:

答案 0 :(得分: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