返回顶部
首页 > 资讯 > 数据库 >mysql中group by分组查询中查询最新字段值的sql语句怎么写?
  • 436
分享到

mysql中group by分组查询中查询最新字段值的sql语句怎么写?

mysqlsql数据库 2023-09-11 11:09:18 436人浏览 薄情痞子
摘要

目录 背景需求效率不高的sql写法效率高的sql写法拓展 背景 今天看代码的时候,看到一个比较复杂的sql语句,我知道这条sql语句最终想要实现的结果,所以我就想自己写sql来实现一下

目录

背景

今天看代码的时候,看到一个比较复杂的sql语句,我知道这条sql语句最终想要实现的结果,所以我就想自己写sql来实现一下,看看速度会不会更好,然后发现别人的sql写法执行效率更高,由此打开了一个新的世界。

需求

在聊天消息记录表中查询该用户和其他消息发送者的“最近一条未读消息id、最近一条未读消息内容、最近一条未读消息接收时间、未读消息数量、消息发送者id、消息发送者名称”。其中表名是msg_record,相关字段如下:

列名解释
id消息记录id
toId消息接收者id
fromId消息发送者id
fromUsername消息发送者名称
date消息发送日期
hasRead是否已读
msgText消息内容

效率不高的sql写法

需求分析:

需要查询的结果中包含“最近一条未读消息id、最近一条未读消息内容、最近一条未读消息接收时间”,针对“最近一条未读消息接收时间”来说,可以使用聚合函数max(),但是剩余两个都是文本性质的内容,那就只能通过排序获取,针对Mysql数据库来说,如果我们获取非分组字段,那mysql数据库会把分组中的第一条返回,所以利用这个特性,我们就先执行排序,然后在分组,之后利用Mysql的上述特性完成数据的获取工作

sql语句:

SELECTa.id,a.fromId,a.fromUsername,a.date,a.msgText lastMsg,count( a.id ) unReadCountFROM(-- 子查询SELECTid,fromId,fromUserName,date,msgText FROMmsg_recordWHEREfromId != "4ebd6f3485f140888ecc25c12e5105b1" AND toId = "4ebd6f3485f140888ecc25c12e5105b1" AND hasRead = FALSE ORDER BYdate DESC ) a GROUP BYa.fromId

执行分析:

在上述sql前面添加EXPLaiN字段即可,我们看下分析结果:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1PRIMARYALL7Using temporary; Using filesort
2DERIVEDiMQ_server_messagerecordALLIDX_IMQ_SERVER_MESSAGERECORD_TOID,IDX_IMQ_SERVER_MESSAGERECORD_FROMIDIDX_IMQ_SERVER_MESSAGERECORD_TOID403117Using where; Using filesort

上述第二行代表子查询使用的是全表扫描,但是使用到了索引;第一行代表全表扫描,但是没有使用索引,两个都是全表扫描,说明效率是真的不高

测试发现,执行时间大致是0.024秒左右

效率高的sql写法

需求分析:

既然先排序的方式不行,那我们就采用先分组在排序的方式来得到最终结果,这就需要使用到SUBSTRING_INDEX、GROUP_CONCAT、CONCAT函数,我们来解释一下这几个函数的含义:

  • SUBSTRING_INDEX:字符串切分函数
  • GROUP_CONCAT:字符串分组连接函数
  • CONCAT:字符串连接函数

详细分析可看:mysql取出每个分组中最新的记录(坑点勿踩)

sql语句:

SELECTSUBSTRING_INDEX( GROUP_CONCAT( CONCAT( id, '*splits*,' ) ORDER BY date DESC ), '*splits*,', 1 ) id,fromId,fromUsername,max( date ) date,SUBSTRING_INDEX( GROUP_CONCAT( CONCAT( msgText, '*splits*,' ) ORDER BY date DESC ), '*splits*,', 1 ) lastMsg,count( id ) unReadCount FROMmsg_recordWHEREtoId = "4ebd6f3485f140888ecc25c12e5105b1" AND fromId != "4ebd6f3485f140888ecc25c12e5105b1" AND hasRead = FALSE GROUP BYfromId

执行分析:

在上述sql前面添加EXPLAIN字段即可,我们看下分析结果:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEIMQ_SERVER_MESSAGERECORDrefIDX_IMQ_SERVER_MESSAGERECORD_TOID,IDX_IMQ_SERVER_MESSAGERECORD_FROMIDIDX_IMQ_SERVER_MESSAGERECORD_TOID403const51Using where; Using filesort

可以看到使用的是ref扫描,并且使用到了索引,并且是常量类型的索引,这肯定速度就比较快。

经测试发现,执行时间大致是0.015秒左右

我们对上面那几个函数的使用情况进行一个解释,我们先使用CONCAT()函数对属性id进行字符串拼接,然后使用GROUP_CONCAT()按照时间进行排序之后在进行字符串拼接,这样就是一个很大的字符串了,之后在使用SUBSTRING_INDEX()进行按照分隔符进行数据截取,就可以获取到结果了

但是这种处理方式也有一个弊端,如果数据量很大的话,通过这几个函数执行相关操作,那就可能会出现内存泄露的问题,但是大部分情况还好

拓展

来源地址:https://blog.csdn.net/qq_42449963/article/details/131141375

您可能感兴趣的文档:

--结束END--

本文标题: mysql中group by分组查询中查询最新字段值的sql语句怎么写?

本文链接: https://lsjlt.com/news/402965.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql中group by分组查询中查询最新字段值的sql语句怎么写?
    目录 背景需求效率不高的sql写法效率高的sql写法拓展 背景 今天看代码的时候,看到一个比较复杂的sql语句,我知道这条sql语句最终想要实现的结果,所以我就想自己写sql来实现一下...
    99+
    2023-09-11
    mysql sql 数据库
  • MySQL数据库分组查询group by语句详解
    一:分组函数的语句顺序 1 SELECT ... 2 FROM ... 3 WHERE ... 4 GROUP BY ...
    99+
    2024-04-02
  • sql中查询语句怎么写
    sql 查询语句用于从数据库中检索数据。其结构包括:select 子句(指定列)、from 子句(指定表)、可选的 where 子句(筛选数据)、可选的 order ...
    99+
    2024-05-10
  • mysql查询字段类型语句怎么写
    mysql查询字段类型语句的写法:示例select column_name,column_comment,data_typefrom information_schema.columnswhere&n...
    99+
    2024-04-02
  • sql分页查询语句怎么写
    SQL分页查询语句可以使用LIMIT关键字来实现。具体语法如下:SELECT 列名FROM 表名LIMIT 开始位置, 查询...
    99+
    2023-08-23
    sql
  • Mysql GROUP BY 查询每组某值最大的一条数据
    表结构如下: 需求:查询每个学科(type)最高分(score) 想要的结果如下: 尝试通过group by order by 查询 sql 如下 SELECT * FROM `repor...
    99+
    2023-09-05
    mysql 数据库 sql
  • php 怎么查询数组字段最小值
    本文操作环境:Windows7系统、PHP7.1、Dell G3。php 怎么查询数组字段最小值PHP获取数组最小值使用内置函数:min()第一步,定义一个数组使用内置函数min()获取数组中的最小值打印得到的最小值保存文件,在浏览器查看打...
    99+
    2019-05-04
    php 最小值
  • mysql的分页查询语句怎么写
    本篇文章给大家分享的是有关mysql的分页查询语句怎么写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql的分页查询语句怎么写1.查询m...
    99+
    2024-04-02
  • 查询mysql user表的sql语句怎么写
    这篇文章主要介绍查询mysql user表的sql语句怎么写,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在mysql中,可以使用“SELECT * FROM mysql.u...
    99+
    2024-04-02
  • MySQL中如何使用GROUP BY分组取字段最大值
    小编给大家分享一下MySQL中如何使用GROUP BY分组取字段最大值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • MySQL查询:Group By 后取出每一组中最大的数据
    环境:MySQL5.7版本 先生成一组测试数据 public static int randAge(){ return new Random().nextInt(100); } public static char randSco...
    99+
    2015-03-20
    MySQL查询:Group By 后取出每一组中最大的数据 数据库入门 数据库基础教程 数据库 mysql
  • MySQL中怎么优化SQL查询语句
    这期内容当中小编将会给大家带来有关MySQL中怎么优化SQL查询语句,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、应尽量避免在 where 子句中使用!=或...
    99+
    2024-04-02
  • SQL怎么查询每个分组都出现的字段值
    今天给大家介绍一下SQL怎么查询每个分组都出现的字段值。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。数据分组以后,要找出在每个分组中都出现的某个字段值。用SQ...
    99+
    2023-06-03
  • 含有GROUP BY子句的查询中该怎么显示
    含有GROUP BY子句的查询中该怎么显示,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  在SQLServer数据库查询中,为了对查询结...
    99+
    2024-04-02
  • sql查询语句之平均分、最高最低分及排序语句怎么写
    这篇文章主要介绍“sql查询语句之平均分、最高最低分及排序语句怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“sql查询语句之平均分、最高最低分及排序语句怎么写”文章能帮助大家解决问题。前言以m...
    99+
    2023-06-30
  • java中复杂查询sql语句该怎么写
    java中的复杂查询sql语句实现: 这样的查询栏,在页面中很常见,这就是复杂查询的条件,我们可以填写一个条件或多个条件,也可以一个都不填写,在这样的情况下我们的sql语句就不能是...
    99+
    2022-11-13
    sql复杂的查询语句 java sql查询语句 java中sql语句怎么写
  • MySQL中DQL数据查询语句怎么写
    这篇文章将为大家详细讲解有关MySQL中DQL数据查询语句怎么写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。目录一、基础查询二、条件查询三、排序查询四、常见函数五、分组...
    99+
    2024-04-02
  • sql查询语句把两个字段的值在一起显示
       今天分享一个如何把name和model的值一起显示 name的值是(棉线,网布,蕾丝等) model的值是(A21-4321,12343,B123a等) 1 select concat(Name,Mode...
    99+
    2016-12-09
    sql查询语句把两个字段的值在一起显示
  • mysql怎么分组查询每组最新记录
    可以使用以下语句来分组查询每组最新记录: SELECT t1.* FROM your_table t1 JOIN ( ...
    99+
    2024-02-29
    mysql
  • mysql索引的查询语句怎么写
    这篇文章主要介绍“mysql索引的查询语句怎么写”,在日常操作中,相信很多人在mysql索引的查询语句怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql索引的查询...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作