为什么订单不工作?

时间:2016-07-21 21:11:11

标签: mysql sql database database-design

我有以下查询:

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来获取最后一个消息。

这有什么问题?还有其他办法吗?

2 个答案:

答案 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)
)