数据库 
首页 > 数据库 > 浏览文章

mysql中count(), group by, order by使用详解

(编辑:jimmy 日期: 2024/6/1 浏览:3 次 )

最近做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 by from_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) as temp_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()就规避了。自己无意躲过去了,还好反复改语句测试了一番才发现。

上一篇:mysql中的跨库关联查询方法
下一篇:MYSQL实现连续签到功能断签一天从头开始(sql语句)
一句话新闻
微软与英特尔等合作伙伴联合定义“AI PC”:键盘需配有Copilot物理按键
几个月来,英特尔、微软、AMD和其它厂商都在共同推动“AI PC”的想法,朝着更多的AI功能迈进。在近日,英特尔在台北举行的开发者活动中,也宣布了关于AI PC加速计划、新的PC开发者计划和独立硬件供应商计划。
在此次发布会上,英特尔还发布了全新的全新的酷睿Ultra Meteor Lake NUC开发套件,以及联合微软等合作伙伴联合定义“AI PC”的定义标准。
友情链接:杰晶网络 DDR爱好者之家 南强小屋 黑松山资源网 白云城资源网