加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 07:13:45 所属栏目:MsSql教程 来源:网络整理
导读:最近做IM的时候遇到一个问题,同时用到了这三个关键字。就是查询一个人的离线消息详情,我们服务端返回给客户端显示的这个详情包括了三个内容,第一个要求列出离线这段时间哪些人或者群给你发了消息,第二个这其中的某个人或者群发了多少条离线消息,第三个

最近做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中的count()与sum()区别详细介绍
  • MYSQL中统计查询结果总行数的便捷方法省去count(*)
  • mySQL count多个表的数据实例详解
  • 关于mysql innodb count(*)速度慢的解决办法
  • MySQL中distinct和count(*)的使用方法比较
  • 详细解读MySQL中COUNT函数的用法
  • mysql_num_rows VS COUNT 效率问题分析
  • 关于mysql中innodb的count优化问题分享
  • 浅析一个MYSQL语法(在查询中使用count)的兼容性问题
  • MySQL中count(*)、count(1)和count(col)的区别汇总

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读