起因

有一张表保存着用户对于文件的阅读记录, 包括文件名, 读者, 阅读时间, 时长, 备注评论.

create table reading_record (

id int primary key auto_increment,-- 自增主键

file varchar(255),-- 阅读文件名

user varchar(255),-- 读者

expend int,-- 阅读时长

time datetime,-- 阅读时间

note text-- 备注评论

)

有个要求是:想要统计每个人对于每个文件的阅读总时长, 阅读次数, 最后阅读时间, 最后的阅读评论

一开始我写了下面的sql去实现这个功能:

select sum(expend) as 阅读总时长, count(id) as 阅读次数, time as 最后阅读时间, note as 最后的阅读评论 from reading_record group by user, file order by id desc;

得到的结果里面阅读总时长和阅读次数时符合要求的, 但是最后阅读时间和最后的阅读评论出现了多条错误的信息

为了证明这个sql写的有问题, 我使用下面的这个sql去进行校验.

select max(id) as 实际的每组最后一次记录id, id as 以为的每组最后一次记录id, sum(expend) as 阅读总时长, count(id) as 阅读次数, time as 最后阅读时间, note as 最后的阅读评论 from reading_record group by user, file order by id desc;

查询结果中出现多条实际的每组最后一次记录id!=以为的每组最后一次记录id.

解决方法

使用组内排序

网上搜索之后发现, 排序的order by是在分组group by之后. 所以首先要做组内排序, 然后再进行分组才能得到正确的结果.

基于上面的方法, 写了下面的sql.

select sum(expend) as 阅读总时长, count(id) as 阅读次数, time as 最后阅读时间, note as 最后的阅读评论 from (select * from reading_record order by id desc) as temptable group by user, file

结果发现:子排序中不管是以desc方式排序还是以asc方式排序, 结果都是一样的

为了排除错误, 我在查询结果字段前面都加上了temptable. 如max(temptable.id), 发现并没有什么作用.

mysql以及mariadb的特性

查了很长时间之后, 终于在一个年限比较新的文章里看到了: 新版本的MySQL或者mariadb会自动忽略subquery的排序

具体的MySQL版本我记不清了.

为了验证这个说法, 我使用了以下的sql:

-- 以id逆序输出

select * from (select * from reading_record order by id desc) as temptable;

-- 以id正序输出

select * from (select * from reading_record order by id) as temptable;

经过验证发现结果仍然是id正序输出的记录, 所以我这个版本的MySQL会忽略subquery的排序.

解决subquery忽略排序

为了实现subquery可以排序, 添加limit限制.

通过给subquery的最后加上limit限制来实现subquery的排序.

-- 为了让子查询可以查到所有的结果, 所以把limit的值设置到非常大

select * from (select * from reading_record order by id desc limit 0, 154785445745657996) as temptable;

以上解决了所有的问题, 所欲最终通过下面的sql实现了我最开始的需求.

select sum(expend) as 阅读总时长, count(id) as 阅读次数, time as 最后阅读时间, note as 最后的阅读评论 from (select * from reading_record order by id desc limit 0, 154785445745657996) as temptable group by user, file

参考文献

( SQL优化:组内排序取最大值 )[http://blog.itpub.net/29730827/viewspace-2136118/]

(mysql group by 组内排序)[http://blog.csdn.net/shellching/article/details/8292338]

mysql 子查询 排序_MySQL的子查询中排序相关推荐

  1. mysql多表查询书籍_MySQL多表查询及子查询

    1. MySQL数据库执行查询操作时的查询流程: 请求-->查询缓存 请求-->查询缓存-->解析器-->预处理器-->优化器-->查询执行引擎-->存储引擎 ...

  2. mysql 单表子查询语句_MySQL基本SQL查询语句:多表查询和子查询示例

    一.简单查询:基本语法: 代码如下 SELECT * FROM tb_name; 查询全部 代码如下 SELECT field1,field2 FROM tb_name; 投影 代码如下 SELECT ...

  3. mysql数据库表子查询语句_MySQL使用子查询教程

    #MYSQL#这是我MyySQL教程的第四篇了,可能对于一些大神来说这些都是小儿科,但是我还是相信这些东西会对一些人有帮助的,本篇主要会介绍上面是子查询以及如何使用它们.大概会从,什么是子查询,利用子 ...

  4. mysql的基本的查询语句_Mysql的基本查询语句

    聚集函数 mysql有5个聚集函数,分别是AVG,MAX,MIN,SUM,COUNT. 分组 分组的使用group by作为关键字,having作为条件关键字. having和where的区别:1.w ...

  5. mysql多表联合查询事例_MySQL——多表查询详细介绍以及实例

    1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表create table man( mid int primary key auto_increment, mna ...

  6. mysql 连接查询索引_Mysql (四)连接查询和索引

    一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...

  7. mysql数据库查询游戏_MySQL数据库高级查询和多表查询

    MySQL多表查询 添加练习表 -- 用户表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id( ...

  8. mysql跨库查询 索引_MySQL中跨库查询怎么搞?

    导读 在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询;另一种是不同服务的跨库查询;它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 在MySQL中跨库查询主要分为两种情况,一种 ...

  9. 清理mysql慢查询日志_MySQL清理慢查询日志slow_log的方法

    一.清除原因 因为之前打开了慢查询,导致此表越来越大达到47G,导致磁盘快被占满,使用xtrabackup进行备份的时候文件也超大. mysql> show variables like 'lo ...

  10. 小白 MySQL数据库链接查询语句_MySQL数据库——连接查询

    今天将用 "手" 来教大家关于MySQL连接查询的知识! ============================================================= ...

最新文章

  1. 在SQL和ERWIN中用自定义类型、规则和默认值实现check约束从而保证数据的完整性...
  2. thymeleaf模板的使用(转)
  3. mybatis映射器${}和#{}的区别
  4. 清华源安装指定版本tensorflow
  5. vs2010没有 最近使用的项目和解决方案
  6. 程序员/设计师能用上的 75 份速查表
  7. Android-用ListView显示SDCard文件列表
  8. 你和阿里资深架构师之间,差的不仅仅是年龄(进阶必看)
  9. AI赋能DevOps:数据驱动的全栈工程师实践
  10. 数据可视化最容易被人忽略的四大误区,怪不得我的报告总被老板骂
  11. CoreAnimation编程指南(八)事务 转自:http://www.dreamingwish.com/
  12. CentOS安装PinPoint
  13. IT报表开发者必看:别加班了,快用这个神器提高报表开发效率
  14. strong,weak, retain, assign的区别@property的参数
  15. Xshell和Xftp免费版
  16. sillyGirl拉库部署+oicq+screen稳定运行完整教程。
  17. 524MB的微信输入法:没广告 你会用吗
  18. rssi室内定位算法原理_室内定位常用算法概述
  19. python风变编程是骗局吗-风变编程的Python课程怎么样?
  20. 计算Sharp夏普率的python和c++代码

热门文章

  1. 用Android写的文字游戏
  2. TOE(TCP/IP Offload / TCP/IP卸载)技术及产品
  3. toe网卡 linux c,TOE(TCP offload Engine)在高频交易中的应用
  4. 裸奔一年机器中毒了 W32/Pate.b
  5. libcurl POST GET 完整步骤与源码
  6. 认识固态继电器及其工作原理
  7. 实现e人e本办公系统、iPad办公系统签批电脑端(Surface)显示和操作一致
  8. Oracle 如何设置外键约束
  9. 民生证券颜阳:大数据走近证券业
  10. EL表达式中将英文日期在页面转换成中文格式日期显示出来