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

 更新时间:2017年05月21日 11:30:23   作者:linux_c_coding_man  
mysql中order by 排序查询、asc升序、desc降序,group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。

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

相关文章

  • Linux中更改转移mysql数据库目录的步骤

    Linux中更改转移mysql数据库目录的步骤

    前几天发现由于MySQL的数据库太大,默认安装的/var盘已经再也无法容纳新增加的数据,只能想办法转移数据的目录。网上有很多相关的文章写到转移数据库目录的文章,但转载的过程中还会有一些错误,因为大部分人根本就没测试过,这篇文章是本文测试过整理好后分享给大家。
    2016-11-11
  • MySQL的语法及其使用指南

    MySQL的语法及其使用指南

    数据库的选取,创建,丢弃和变更 数据表和索引的创建,变更和丢弃从数据表检索信息
    2008-04-04
  • Mysql中有关Datetime和Timestamp的使用总结

    Mysql中有关Datetime和Timestamp的使用总结

    mysql数据库常用的时间类型有timestamp和datetime,两者主要区别是占用存储空间长度不一致、可存储的时间也有限制,本文就来详细的介绍一下,感兴趣的可以了解一下
    2021-12-12
  • mySQL 8.0.33安装指南(推荐)

    mySQL 8.0.33安装指南(推荐)

    本文提供MySQL8.0.33的详细安装步骤,从解压安装包到设置系统服务、配置远程访问及安全设置等,包括创建和配置MySQL用户,设置环境变量,初始化数据库等关键操作,同时强调安全性的重要性,如设置强密码、限制远程访问权限,并建议在重要操作前进行数据库备份
    2024-10-10
  • mysql允许远程连接的方法

    mysql允许远程连接的方法

    这篇文章主要介绍了mysql允许远程连接的方法,内容很详细,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • MySQL利用frm文件和ibd文件恢复表结构和表数据

    MySQL利用frm文件和ibd文件恢复表结构和表数据

    当MySQL数据库遭遇崩溃或数据丢失时,利用备份的 .frm 和 .ibd 文件恢复数据是一种有效的解决方案,.frm 文件包含表的结构信息,而 .ibd 文件则存储表的实际数据,本文将提供一个详细的步骤指南,演示如何利用这些文件恢复MySQL表数据和表结构,需要的朋友可以参考下
    2024-05-05
  • mysql8报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT解决办法

    mysql8报错:ERROR 1410 (42000): You are not allowed to 

    电脑新装的mysql,版本为8.0以上,分配权限时直接带密码和账号会报错,这篇文章主要给大家介绍了关于mysql8报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT的解决办法,需要的朋友可以参考下
    2022-06-06
  • mysql community server 8.0.12安装配置方法图文教程

    mysql community server 8.0.12安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql community Server 8.0.12安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Mysql实时备份实现方法

    Mysql实时备份实现方法

    这篇文章主要介绍了Mysql实现实时备份,需要的朋友可以参考下
    2016-02-02
  • MySQL如何优化查询速度

    MySQL如何优化查询速度

    这篇文章主要介绍了MySQL如何优化查询速度,帮助大家提升自己的数据库性能,感兴趣的朋友可以了解下
    2020-08-08

最新评论