问题
我正在寻找在'之后获得最低时间戳(最早)的时间戳。已经更改了故障单对话,以查看自第一次回复最新消息以来已经过了多长时间。
示例:
A (10:00) : Hello
A (10:05) : How are you?
B (10:06) : I'm fine, thank you
B (10:08) : How about you?
A (10:10) : I'm fine too, thank you <------
A (10:15) : I have to go now, see you around!
现在我要找的是箭头指示的消息的时间戳。 &#39;之后的第一条消息&#39;对话的内容发生了变化,在这种情况下从用户到支持。
表格中的示例数据&#34;消息&#34;:
mid conv_id uid created_at message type
2750 1 3941 1341470051 Hello support
3615 1 3941 1342186946 How are you? support
4964 1 2210 1343588022 I'm fine, thank you user
4965 1 2210 1343588129 How about you? user
5704 1 3941 1344258743 I'm fine too, thank you support
5706 1 3941 1344258943 I have to go now, see you around! support
到目前为止我尝试了什么:
select
n.nid AS `node_id`,
(
SELECT m_inner.created_at
FROM messages m_inner
WHERE m_inner.mid = messages.mid AND
CASE
WHEN MAX(m_support.created_at) < MAX(m_user.created_at) THEN -- latest reply from user
m_support.created_at
ELSE
m_user.created_at
END <= m_inner.created_at
ORDER BY messages.created_at ASC
LIMIT 0,1
) AS `latest_role_switch_timestamp`
from
node n
left join messages m on n.nid = messages.nid
left join messages m_user on n.nid = m_user.nid and m_user.type = 'user'
left join messages m_support on n.nid = m_support.nid and m_support.type = 'support'
GROUP BY messages.type, messages.nid
ORDER BY messages.nid, messages.created_at DESC
首选结果:
node_id latest_role_switch_timestamp
1 1344258743
但是这对子查询没有产生任何结果。我正朝着正确的方向前进,还是应该尝试别的东西?我不知道这是否可以在mysql中使用。
此外,这使用子查询,出于性能原因,该查询并不理想,考虑到此查询可能会在概述中使用,这意味着它必须为概述中的每条消息运行该子查询。
如果您需要更多信息,请告诉我,因为我在我的智慧结束
答案 0 :(得分:1)
将表格加入到自身的最新摘要中以获取最后一个块的消息,然后使用mysql的特殊分组支持从那些行中选择第一行行。每次谈话:
select * from (
select * from (
select m.*
from messages m
join (
select conv_id, type, max(created_at) last_created
from messages
group by 1,2) x
on x.conv_id = m.conv_id
and x.type != m.type
and x.last_created < m.created_at) y
order by created_at) z
group by conv_id
这将返回整个行,它是最后一个块的第一条消息。
请参阅SQLFiddle。
性能非常好,因为没有相关的子查询。