对话包含消息,一条消息可以发送给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
谢谢!
答案 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