当前位置:   article > 正文

mysql 分组之后 取分组之后最新的数据_mysql max group取最新一条数据不对

mysql max group取最新一条数据不对

一、数据表设计

二、查询场景 

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

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

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

查询结果:

 2、最新一次考试的时间

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

查询结果:

 

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

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

  1. SELECT
  2. a.id,
  3. a.edit_teacher,
  4. a.project,
  5. a.create_time,
  6. a.score,
  7. count(project) '考试次数',
  8. max(create_time) '最新数据时间'
  9. FROM
  10. score a
  11. GROUP BY
  12. a.project

查询结果:

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

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

  1. SELECT
  2. *,
  3. count( project ) '考试次数',
  4. max(create_time) '最新数据时间'
  5. FROM
  6. (
  7. SELECT
  8. a.id,
  9. a.edit_teacher,
  10. a.project,
  11. a.create_time,
  12. a.score
  13. FROM
  14. score a
  15. ORDER BY
  16. a.id DESC
  17. ) b
  18. GROUP BY
  19. b.project

查询结果:

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

网上查找各种资料发现

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

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

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

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

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

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

  1. SELECT
  2. *,
  3. count( project ) '考试次数' ,
  4. max(create_time) '最新数据时间'
  5. FROM
  6. (
  7. SELECT DISTINCT
  8. a.id,
  9. a.edit_teacher,
  10. a.project,
  11. a.create_time,
  12. a.score
  13. FROM
  14. score a
  15. ORDER BY
  16. a.id DESC
  17. ) b
  18. GROUP BY
  19. b.project

执行结果:

 结果正确。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号