文章目录

  • 前言
    • 出现的问题
    • 如何解决
      • 方法一:改写sql
      • 方法二:改写sql
      • 方法三:改写sql

前言

很多时候我们常常感觉到,不要你以为,mysql要它以为。记录派生表踩坑记录。

首先说明环境mysql5.7,脚本如下

CREATE TABLE `emp` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`sal` float(255,0) DEFAULT NULL,`deptno` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;insert into emp (name,sal,deptno) values ('emp1001',100,10);
insert into emp (name,sal,deptno) values ('emp1002',200,10);
insert into emp (name,sal,deptno) values ('emp1003',300,20);
insert into emp (name,sal,deptno) values ('emp1004',400,20);
insert into emp (name,sal,deptno) values ('emp1005',500,30);
insert into emp (name,sal,deptno) values ('emp1006',600,30);

出现的问题

我们要查询出每个部门工资最高的人

SELECTdeptno,name,sal
FROM( SELECT * FROM emp ORDER BY sal DESC ) t
GROUP BY deptno;

上条sql在msql5.7平台会报错

1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column 't.name' which is not functionally dependent on columns inGROUP BY clause; this is incompatible with sql_mode=only_full_group_by, Time: 0.001000s

说的是t.name这个字段不在聚合的结果中。很多人可能不以为然,认为没人会这样写,但在大名鼎鼎的stackoverflow中,该实现的点赞数就有116个-由此可见其受众之广,仅次于后面提到的“方法二”(点赞数206个)。
https://stackoverflow.com/questions/12102200/get-records-with-max-value-for-each-group-of-grouped-sql-results

这个与sql_mode有关,在MySQL 5.7中,sql_mode调整为了select @@sql_mode

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

其中,ONLY_FULL_GROUP_BY与group by语句有关,其要求select列表里只能出现分组列(即group by后面的列)和聚合函数(sum,avg,max等),这也是SQL92的标准。

如何解决

方法一:改写sql

SELECTe.deptno,name,sal
FROMemp e,( SELECT deptno, max( sal ) maxsal FROM emp GROUP BY deptno ) t
WHEREe.deptno = t.deptno AND e.sal = t.maxsal;

方法二:改写sql

SELECTa.deptno,a.name,a.sal
FROMemp aLEFT JOIN emp b ON a.deptno = b.deptno AND a.sal < b.sal
WHEREb.sal IS NULL;

方法三:改写sql

SELECT*
FROMemp
WHEREsal IN (SELECTmax( sal ) FROMemp
GROUP BYdeptno)

文末鸡汤:

人生,是踏上了就回不了头的征程。要记住:面对,不一定最难过;孤独,不一定不快乐;得到,不一定能长久。珍惜拥有,用心生活,坦然无悔,超越自己,和生命一起精彩!

【mysql】 踩坑记录之derived(派生表)相关推荐

  1. Mac安装Mysql踩坑记录

    Mac安装Mysql遇到ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)解决方法 ...

  2. mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题

    问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...

  3. MySql 踩坑小记

    MySql 踩坑一时爽,一直踩啊一直爽... 以下记录刚踩的三个坑,emmm... 首先是远程机子上创建表错误(踩第一个坑),于是将本地机器 MySql 版本回退至和远程一致(踩第二个坑),最后在第二 ...

  4. MySql 踩坑小记 1

    MySql 踩坑一时爽,一直踩啊一直爽... 以下记录刚踩的三个坑,emmm... 首先是远程机子上创建表错误(踩第一个坑),于是将本地机器 MySql 版本回退至和远程一致(踩第二个坑),最后在第二 ...

  5. mybatis学习与踩坑记录

    mybatis resultmap高级映射 应用场景:如果sql查询的列名和pojo的属性名不一致,可以使用resultMap将列名和pojo的属性名作一个对应关系,就可以映射成功了.(如果返回值为i ...

  6. 日常踩坑记录-汇总版

    开发踩坑记录,不定时更新 心得 RTFM 严谨的去思考问题,处理问题 严格要求自己的代码编写习惯与风格 注意 单词拼写 20200207 mybatis plus 自带insert插入异常 sql i ...

  7. Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

    Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...

  8. 【踩坑记录】mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错

    [踩坑记录]mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错 报错记录 解决方案 推荐方案 使用uuid作为主键,修改id的类型为bigint ...

  9. 【学习记录】QT5界面设计的踩坑记录

    学习记录:QT5 界面设计的踩坑记录 前言 一.Qlabel显示视频与图片 1. 图片显示 1.1 显示格式 1.2 label随界面缩放 1.3 界面刷新 2. 视频显示 二.常见控件的StyleS ...

最新文章

  1. NanodetPlus网络结构
  2. Linux疑难杂症解决方案100篇(四)-SHELL编程预留题目解析
  3. 敏捷毒药-敏捷中有损组织整体的负面实践
  4. MVC in MFC or WTL - yinxufeng - 博客园
  5. 21-特征匹配方法(Brute-Force蛮力匹配)
  6. 大数的四则运算(加法、减法、乘法、除法)
  7. vant-联系人卡片
  8. 《Metasploit渗透测试手册》—第3章3.5节在Windows 2003 Server上进行渗透测试
  9. python下载快手视频教程_[小玩意] 用Python写了个下载快手视频的小脚本
  10. SBC音频编解码算法(转载)
  11. VMware SDS之十: VMware SPBM之SolidFire篇
  12. Session-判断用户登陆验证码是否正确
  13. Docker进入容器报错
  14. Axure8.0基础教程 一
  15. kubesphere离线安装从入门到放弃
  16. 「DaoCloud 道客」云原生一体机:开箱即用,轻松上云
  17. 压力测试Jmeter+badboy
  18. 【转】一款已上市MMO手游地图同步方案总结
  19. 谈谈我对于项目管理的认识!
  20. 新构造运动名词解释_新构造运动的含义

热门文章

  1. java 使用class转型_java中向上转型(upcast)和向下转型(downcast)
  2. FRM-92050:连接服务器失败
  3. wps怎么把字缩到最小_WPS文字如何调节字体大小突破字号72的限制实现大小随意调...
  4. Win7环境安装Anaconda
  5. 苹果xsmax怎么开机_苹果XSMAX手机进水不开机怎么办?看小伙如何完美修复!
  6. Activity跳转后自动执行了onDestroy
  7. 华为新旗舰鸿蒙,华为新旗舰6月即将登场!鸿蒙系统+液态镜头,比Mate40更难购买...
  8. 电脑端手机模拟器软件
  9. ios 绘制线框_iOS 各种边框
  10. babel的使用(关于使用async报错的问题)