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 查询患某种疾病的患者语句

    Mysql 查询患某种疾病的患者语句

    select 语句的作用是根据输入的条件返回指定的数据结果,select 的语法可以有很多种查询的组合,基本上能够满足我们所有的查询数据需求,这篇文章主要介绍了Mysql 查询患某种疾病的患者,需要的朋友可以参考下
    2022-10-10
  • mysql 5.7.13 winx64安装配置方法图文教程

    mysql 5.7.13 winx64安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.7.13winx64安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-06-06
  • 五分钟让你快速弄懂MySQL索引下推

    五分钟让你快速弄懂MySQL索引下推

    ICP(Index Condition Pushdown)是在MySQL 5.6版本上推出的查询优化策略,把本来由Server层做的索引条件检查下推给存储引擎层来做,下面这篇文章主要给大家介绍了关于MySQL索引下推的相关资料,需要的朋友可以参考下
    2021-09-09
  • MySQL中SQL分页查询的几种实现方法及优缺点

    MySQL中SQL分页查询的几种实现方法及优缺点

    这篇文章主要介绍了MySQL中SQL分页查询的几种实现方法及优缺点, 分页查询就是在满足条件的一堆有序数据中截取当前所需要展示的那部分。对此感兴趣的可以来了解一下
    2020-07-07
  • MySql安装步骤图文教程及中文乱码的解决方案

    MySql安装步骤图文教程及中文乱码的解决方案

    这篇文章主要介绍了MySql安装步骤图文教程及中文乱码的解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • mysql-canal-rabbitmq 安装部署超详细教程

    mysql-canal-rabbitmq 安装部署超详细教程

    这篇文章主要介绍了mysql-canal-rabbitmq 安装部署超详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • MySQL InnoDB中的锁机制深入讲解

    MySQL InnoDB中的锁机制深入讲解

    这篇文章主要给大家介绍了关于MySQL InnoDB中锁机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • mysql 8.0版本更换用户密码的方法步骤

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

    这篇文章主要给大家介绍了关于mysql 8.0版本更换用户密码的方法步骤,MySQL用户密码的修改是经常面临的一个问题,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • mysql unsigned 用法及相减出现补数溢出解决方法

    mysql unsigned 用法及相减出现补数溢出解决方法

    unsigned表示无符号的意思,也就是非负数,只用于整型并且unsigned 是MYSQL自定义的类型,非标准SQL。用途1是红苕说的起到约束数值的作用,2是可以增加数值范围(相当于把负数那部分加到正数上)。不过少用,不方便移植
    2012-04-04
  • linux下安装mysql数据库5.6源码安装,修改登录用户密码

    linux下安装mysql数据库5.6源码安装,修改登录用户密码

    这篇文章主要介绍了linux下安装mysql5.6版本并修改登录用户密码的方法。
    2017-11-11

最新评论