• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
是哒hhh 显示全部楼层 发表于 2021-10-25 19:48:46 |阅读模式 打印 上一主题 下一主题
近来做IM的时间遇到一个问题,同时用到了这三个关键字。就是查询一个人的离线消息详情,我们服务端返回给客户端表现的这个详情包罗了三个内容,第一个要求列出离线这段时间哪些人或者群给你发了消息,第二个这此中的某个人或者群发了多少条离线消息,第三个拿出最新的一条表现出来。很明显,group by分组哪些人或者群给你发了离线消息,count()得到离线消息数目,order by时间来排序拿出最新的消息。
  1. 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一起检索就报错了,我们可以用嵌套子查询。
  1. 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;<br />
复制代码
我们可以对已经排序的效果集,再来分组并计算数目。这里还有一个暗坑,我本身不警惕给躲已往了,着实count()会造成order by排序无效,举个例子:
  1. 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()就规避了。本身无意躲已往了,还好反复改语句测试了一番才发现。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作