MAX函数和GROUP BY 语句一起使用的一个误区

简介:
使用MAX 函数和 GROUP 的时候会有不可预料的数据被SELECT 出来。
下面举个简单的例子:
想知道每个SCOREID 的 数学成绩最高的分数。


表信息:
/*DDL Information For - test.lkscore*/
--------------------------------------

Table    Create Table                                                                  
-------  -----------------------------------------------------------------------------
lkscore  CREATE TABLE `lkscore` (                                                     
           `scoreid` int(11) DEFAULT NULL,                                            
           `chinese` int(11) DEFAULT '0',                                             
           `math` int(11) DEFAULT '0',                                                
           KEY `fk_class` (`scoreid`),                                                
           CONSTRAINT `fk_class` FOREIGN KEY (`scoreid`) REFERENCES `lkclass` (`id`)  
         ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                                       




select * from lkscore;

query result(12 records)

scoreid chinese math
1 90 80
2 100 99
3 29 98
4 87 79
5 89 99
1 49 98
3 98 56
2 76 88
2 80 90
3 90 70
1 90 90
1 67 90


错误的SELECT
select scoreid,chinese,max(math) max_math from lkscore group by scoreid;

query result(5 records)

scoreid chinese max_math
1 90 98
2 100 99
3 29 98
4 87 79
5 89 99
上面的90明显不对。

方法一:

select scoreid,chinese,math max_math from 
(
select * from lkscore order by math desc
) T 
group by scoreid;

query result(5 records)

scoreid chinese max_math
1 49 98
2 100 99
3 29 98
4 87 79
5 89 99

方法二:


select * from lkscore a where a.math = (select max(math) from lkscore where scoreid = a.scoreid) order by scoreid asc;

query result(5 records)

scoreid chinese max_math
1 49 98
2 100 99
3 29 98
4 87 79
5 89 99

这个也是用MAX函数,而且还用到了相关子查询。
我们来看一下这两个的效率如何:


explain 
select scoreid,chinese,math max_math from (select * from lkscore order by math desc) T group by scoreid;

query result(2 records)

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 12 Using temporary; Using filesort
2 DERIVED lkscore ALL (NULL) (NULL) (NULL) (NULL) 12 Using filesort

很明显,有两个FULL TABLE SCAN。



explain 
select scoreid,chinese,math max_math from lkscore a where a.math = 
(select max(math) from lkscore where scoreid = a.scoreid) order by scoreid asc;

query result(2 records)

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY a index (NULL) fk_class 5 (NULL) 12 Using where
2 DEPENDENT SUBQUERY lkscore ref fk_class fk_class 5 a.scoreid 1 Using where


第二个就用了KEY,子查询里只扫描了一跳记录。

很明显。在这种情况下第二个比第一个效率高点。






本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/81278,如需转载请自行联系原作者

相关文章
|
移动开发 前端开发 JavaScript
一些框架获取当前登录用户以及用户信息整理
无论是哪一个框架,获取当前登录用户信息是必不可少的,做一些功能的时候我们肯定得用到当前登陆者信息,所以我就查找了一下几个框架是如何获取当前用户信息,例如在若依框架中,用 this.$store.state.user就可以获取到。当获得的信息是极少时,不足够我们做其他功能时,当然你也可以自己在这个获取的基础上面增加所需信息即可。
一些框架获取当前登录用户以及用户信息整理
|
数据库
Unknown column ‘字段名‘ in ‘field list‘解决方法
Unknown column ‘字段名’ in 'field list’英语翻译过来就是未知列的字段名在字段表中,也就是说数据库表中的字段名在实体类中找不到。 解决方案如下: 查看实体类的属性名和数据库表中的名字是否一致(注意数据库表字段中是否有空格或者下划线)
4649 0
|
10月前
|
机器学习/深度学习 人工智能 算法
探索人工智能在图像处理中的应用
【10月更文挑战第32天】本文将深入探讨人工智能(AI)如何在图像处理领域大放异彩,从基础的图像识别到复杂的场景解析,AI技术正逐步改变我们对视觉信息的理解和应用。文章将通过具体案例,揭示AI如何优化图像质量、实现风格迁移和进行内容识别,进而讨论这些技术背后的挑战与未来发展方向。
503 1
|
关系型数据库 MySQL
13. Mysql 使用WITH进行复杂和递归查询
13. Mysql 使用WITH进行复杂和递归查询
1321 4
|
Java 调度
java定时任务3分钟一次
7月更文挑战第6天
534 1
|
存储 程序员
JavaWeb之Listener监听器
JavaWeb之Listener监听器
212 0
|
SQL 数据库
详解BaseMapper
详解BaseMapper
617 0
|
存储 缓存 监控
提升阿里云 RPA 性能的方法
随着企业对业务流程自动化的需求不断增长,阿里云 RPA(机器人流程自动化)的性能成为了关注的焦点。本文将介绍一些提升阿里云 RPA 性能的方法,帮助您充分发挥其潜力,实现更高效的业务流程自动化。
|
存储 SQL Java
数据库小技能:存储过程(stored procedure)
过程(procedure)又叫存储过程(stored procedure),是一个有名称的PL/SQL程序块 。 过程相当于java中的方法, 它注重的是实现某种业务功能 。 函数(function)也相当于java中的方法,它 注重计算并且总是有返回结果 。 过程和函数都是能够永久存储在数据库中的程序代码块,应用时通过调用执行 。
534 1
|
Java
【Java异常】Feign常见的坑总结之一:Method Not Allowed“,“message“:“Request method ‘POST‘ not supported“,“path“:“/*
【Java异常】Feign常见的坑总结之一:Method Not Allowed“,“message“:“Request method ‘POST‘ not supported“,“path“:“/*
543 0

热门文章

最新文章