mysql如何取分组之后最新的数据

 更新时间:2022年06月08日 14:41:59   作者:Tracy苏何  
开发中经常会遇到,分组查询最新数据的问题,下面这篇文章主要给大家介绍了关于mysql如何取分组之后最新的数据的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

一、数据表设计

二、查询场景 

统计每门课的考试次数、最新一次考试的时间、最新一次考试的录入成绩的老师

1、统计没门课的考试次数

#考试次数统计
select project '科目',count(project) '考试次数' from score a group by project

查询结果:

 2、最新一次考试的时间

#考试次数统计	最新一次考试的时间
select project '科目',count(project) '考试次数' ,max(create_time) from score a group by project

查询结果:

 

 3、分组统计最新的录入成绩的老师

当我们分组去查询最新的录入成绩的老师或者分组查询最新一次各科的成绩时确发现数据不是最新的。

SELECT
	a.id,
	a.edit_teacher,
	a.project,
	a.create_time,
	a.score, 
	count(project) '考试次数',
	max(create_time) '最新数据时间'
FROM
	score a 
GROUP BY
	a.project

查询结果:

但是很显然我们需要查询的数据id应该是4、8、12

 可以看出分组聚合的时候默认查询的是分组之后的第一条数据,那么我们想要查询最新的数据需要新对我们的数据进行排序

SELECT
	*,
	count( project ) '考试次数',
	max(create_time) '最新数据时间' 
FROM
	(
SELECT
	a.id,
	a.edit_teacher,
	a.project,
	a.create_time,
	a.score 
FROM
	score a 
ORDER BY
	a.id DESC 
	) b 
GROUP BY
	b.project

查询结果:

我们发现数据并不是我们想要的结果,子查询里面的排序失效了

网上查找各种资料发现

子查询生成的临时表(派生表derived table)中使用order by且使其生效,必须满足三个条件:

1、外部查询禁止分组或者聚合

2、外部查询未指定having,HAVING, order by

3、外部查询将派生表或者视图作为from句中唯一指定源

显然我们没有满足,那么如何解决order by失效呢?

我们外部表使用了group by,那么临时表将不会执行filesort操作(即order by会被忽略),所以我们可以在临时表中加上(distinct(a.id))。

SELECT
	*,
	count( project ) '考试次数' ,
	max(create_time) '最新数据时间' 
FROM
	(
SELECT DISTINCT
	a.id,
	a.edit_teacher,
	a.project,
	a.create_time,
	a.score 
FROM
	score a 
ORDER BY
	a.id DESC 
	) b 
GROUP BY
	b.project

执行结果:

 结果正确。

总结

到此这篇关于mysql如何取分组之后最新的数据的文章就介绍到这了,更多相关mysql取分组最新数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中in和exists区别详解

    MySQL中in和exists区别详解

    最近在写SQL语句时,对选择IN 还是Exists犹豫不决,所以就上网查询了一下资料,本文就详细的介绍了两个方法的区别,感兴趣的可以了解一下
    2021-06-06
  • 在MySQL中实现二分查找的详细教程

    在MySQL中实现二分查找的详细教程

    这篇文章主要介绍了在MySQL中实现二分查找的详细教程,来自计算机研究生考试原题,需要的朋友可以参考下
    2015-05-05
  • 一文详解MYSQL最朴素的监控方式

    一文详解MYSQL最朴素的监控方式

    对于当前数据库的监控方式有很多,分为数据库自带、商用、开源三大类,每一种都有各自的特色,那我们今天就介绍一下完全采用mysql自有方式采集获取监控数据,在单体下达到最快速、方便、损耗最小,感兴趣的同学可以借鉴阅读
    2023-05-05
  • MySQL请求处理全流程之如何从SQL语句到数据返回

    MySQL请求处理全流程之如何从SQL语句到数据返回

    这篇文章主要介绍了MySQL请求处理全流程之如何从SQL语句到数据返回,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-03-03
  • MySQL数据库创建新用户及授予权限的完整流程

    MySQL数据库创建新用户及授予权限的完整流程

    这篇文章主要给大家介绍了MySQL数据库创建新用户及授予权限的完整流程,通过这些步骤,管理员可以有效管理数据库用户,确保数据库的安全性和高效运行,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • mysql 8.0版本更换用户密码的方法步骤

    mysql 8.0版本更换用户密码的方法步骤

    这篇文章主要给大家介绍了关于mysql 8.0版本更换用户密码的方法步骤,MySQL用户密码的修改是经常面临的一个问题,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • MySQL 5.7.13 源码编译安装配置方法图文教程

    MySQL 5.7.13 源码编译安装配置方法图文教程

    这篇文章主要介绍了MySQL 5.7.13 源码编译安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Mysql的MHA高可用及故障切换问题小结

    Mysql的MHA高可用及故障切换问题小结

    MHA是基于MySQL主从复制的高可用解决方案,通过自动切换到从节点并提升其为新主,实现数据库的高可用和故障恢复,配置包括主从复制、MHA组件、VIP管理等,通过配置无密码认证和测试连接,可以确保MHA正常运行,感兴趣的朋友一起看看吧
    2024-12-12
  • MySQL中NOT IN填坑之列为null的问题解决

    MySQL中NOT IN填坑之列为null的问题解决

    这篇文章主要给大家介绍了关于MySQL中NOT IN填坑之列为null的问题解决的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • MySQL函数CONCAT、CONCAT_WS、GROUP_CONCAT用法详解

    MySQL函数CONCAT、CONCAT_WS、GROUP_CONCAT用法详解

    这篇文章主要介绍了MySQL函数CONCAT、CONCAT_WS、GROUP_CONCAT用法详解,CONCAT 函数用于将两个字符串连接为一个字符串,本文通过实例代码详细讲解,需要的朋友可以参考下
    2023-02-02

最新评论