我有以下查询:
select DISTINCT CASE WHEN msg_from = 35
then msg_to else msg_from
end msg_from_result , msg_id,msg_from,msg_to,msg_content,msg_status,msg_created_at,
(select user_name from users where user_id = msg_from_result) user_name
from messages
where 35 in (msg_from , msg_to)
group by msg_from_result
order by msg_id desc
这应该检索与属于它的最后一条消息的对话。
会话被检索,但问题是我无法通过设置ORDER BY
来使用ORDER BY msg_id DESC
来获取最后一个消息。
这有什么问题?还有其他办法吗?
答案 0 :(得分:1)
我想我得到了你想要做的事,但这就是我写的方式(如果我理解正确的话):
select users.user_name, msg_id, msg_from, msg_to, msg_content, msg_status, msg_created_at
from (
select if(msg_from = 35,msg_to,msg_from) as msg_from_result
, max(msg_id) as last_message
from messages
where 35 in (msg_from,msg_to)
group by msg_from_result,last_message
) der_table -- creating a table of conversations and the last message ids
join users on user_id=der_table.msg_from_result
join messages on messages.msg_id=der_table.last_message
order by msg_id desc
您需要获取最后一条消息ID才能获取消息的内容等。
答案 1 :(得分:1)
你想要的(我认为)是一个相关的子查询。外部查询的结果受子查询中谓词的真实性限制。在您的情况下,您需要有关上一个msg_id
的信息。
我多次以不同形式回答这个问题,我写了a simple example。根据您目前的情况,我认为您可以将其转换为您的特定查询。它看起来像
where exists (
select 1 from messages
where outer.msg_id = msg_id
group by msg_id
having outer.msg_id = max(msg_id)
)