最近做IM的时候遇到⼀个问题,同时⽤到了这三个关键字。就是查询⼀个⼈的离线消息详情,我们服务端返回给客户端显⽰的这个详情包括了三个内容,第⼀个要求列出离线这段时间哪些⼈或者群给你发了消息,第⼆个这其中的某个⼈或者群发了多少条离线消息,第三个拿出最新的⼀条显⽰出来。很明显,group by分组哪些⼈或者群给你发了离线消息,count()得到离线消息数量,order by时间来排序拿出最新的消息。
select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc group byfrom_company_id, from_user_id;
然后果不其然group by和order by⼀起检索就报错了,我们可以⽤嵌套⼦查询。
select count(1) as cnt, msg_data from (select * from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc) astemp_table group by from_company_id, from_user_id;
我们可以对已经排序的结果集,再来分组并计算数量。这⾥还有⼀个暗坑,我⾃⼰不⼩⼼给躲过去了,其实count()会造成order by排序⽆效,举个例⼦:
select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc;
这个语句最后得到的⼀条记录,其中的msg_data其实是根本没有排序的结果,也就是数据库原顺序,应该是先插⼊的⼀条消息,就是说时间旧的消息。为了避免这个问题,所以嵌套⼦查询在这⾥先排序,再让它去count()就规避了。⾃⼰⽆意躲过去了,还好反复改语句测试了⼀番才发现。
因篇幅问题不能全部显示,请点此查看更多更全内容