使用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 record

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明显不对。

方法一:提示:查了一下,mysql5.7之后对于这个顺序很像进行改变了,所以使用这个语句的时候要特别小心。这个是我执行语句之后的结果,我机子上的Mysql是5.7版本的,不适用。

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,子查询里只扫描了一跳记录。

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

mysql max() grou by 的使用小记相关推荐

  1. MySQL max()函数

    转载自  MySQL max()函数 MySQL MAX函数介绍 MySQL MAX()函数返回一组值中的最大值.MAX()函数在许多查询中非常方便,例如查找最大数量,最昂贵的产品以及客户的最大付款. ...

  2. mysql max和order by_mysql – 为什么MAX()比ORDER BY慢100倍… LIMIT 1?

    我有一个表foo(在其他20个之中)列bar,baz和quux以及baz和quux上的索引.该表有~500k行. 为什么以下查询的速度差异如此之大?查询A需要0.3秒,而查询B需要28秒. 查询A. ...

  3. mysql max 命令大全_MySQL常用命令,34道练习题(持续更新中)。

    1.使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2.创建一个数据库MYSQLDATA mysql> CREATE DATABASE M ...

  4. mysql max嵌套select_使用嵌套select子式 解决mysql不能叠加使用如max(sum())的问题

    网上也有解决方案 有的有瑕疵 有的较复杂(mysql没有分析函数,可以使用变量实现) select sumScoreValue,studentid,studentName from sc_studen ...

  5. mysql max where_MAX函数中的where子句mysql

    您不能在同一查询的WHERE子句中引用聚合函数的结果(例如MAX()). 解决这种类型问题的规范模式是使用内联视图,如下所示: SELECT t.firstName , t.Lastname , t. ...

  6. mysql tracker_linux架设BT Tracker服务器小记

    linux架设BT Tracker服务器小记 目前开源的Bt tracker项目有: 官方Tracker为 www.bittorrent.com/ 使用python语言 windows下的tracke ...

  7. mySQL MAX与sum 连用_mysql – 在sql脚本中一起使用sum和max

    我已经更新了查询,但现在出现的错误是:SQL语法中有错误;检查与您的 MySQL服务器版本对应的手册,以便在'AS max_parameter_value附近使用正确的语法 来自第7行的tcs.par ...

  8. mysql max 获取另外值_来看看 MySQL 的这个 BUG,坑了多少人....

    来源: cloud.tencent.com/developer/article/1367681 问题描述 近期,线上有个重要Mysql客户的表在从5.6升级到5.7后master上插入过程中出现&qu ...

  9. mysql max()函数和min函数

    MAX()返回指定列的最大值.MAX要求指定列名. 对非数值数据使用MAX():虽然max()一般用来找出最大的数值或日期值,但mysql允许将它用来返回任意列中的最大值,包括返回文本列中的最大值.在 ...

  10. mysql max pool_asp.net连接mysql得到错误all pooled connections were in use and max pool size was reach...

    asp.net连接mysql数据库时,得到以下错误信息 MySql.Data.MySqlClient.MySqlException (0×80004005): error connecting: Ti ...

最新文章

  1. Confluence 6 生产环境备份策略
  2. 基于深度学习的步态识别算法的MATLAB仿真
  3. 威驰fs高配和低配有什么区别_“电子手刹”和“机械手刹”的区别有多大?很多车主不清楚...
  4. 云南旅游市场整治呈压倒性态势 旅游人次及年收入双增长
  5. 8口poe交换机产品介绍
  6. echarts label加边框_echarts 添加自定义label标签
  7. Petuum - Careers
  8. 29.课时29.【Django模板】url标签使用详解(Av61533158,P29)
  9. (05)System Verilog 数组类型详解
  10. kill apache
  11. 蓝牙耳机连接电脑没有声音解决办法
  12. js设计模式之策略模式
  13. 计算机学院研发------考核之界面
  14. c语言等差数列试题及其答案,等差数列练习题
  15. ThuThesis模板中\footnote每页重新从2编号的问题解决
  16. 龙渊无限法则服务器,龙渊大陆无限法则
  17. pip设置默认为清华镜像
  18. #Python第三方模块学习笔记(四)——CSV模块功能及主要函数介绍
  19. 【思维论01】如何让自己像打王者荣耀一样发了疯、石乐志的学习?
  20. Rabbitmq 和erlang 安装成功但是网面访问不了

热门文章

  1. 我的回忆录:如何成为会写书的程序员?
  2. JavaWeb分页显示内容和数据库分页查询
  3. POJ 3764 The Xor-longest Path 题解
  4. (阿里云笔记)购置域名+云解析DNS域名
  5. 如何学习计算机思维,刘康平:为什么我们每个人都应该学习计算思维?
  6. 各国家分析之加拿大安道尔
  7. LOAP its implimenlation
  8. c语言程序设计判断是否是素数,C语言编程输入一个数判断是否为素数(质数)...
  9. “校内网”将不存在,“校内网”更名为“人人网”
  10. 2k21sports服务器暂时不可用,NBA2K20服务器不可用怎么解决 nba2k20进不去游戏解决办法...