Mysql5.7版本子查询order by 和 group by取值查询中无效的处理方法

mysql5.6之前的版本 可以在子查询先order by 日期字段,外面在包一层 group by fund_code就可以查询 fund_code 的最新数据了。mysql5.7的查询优化导致这个查询不能用了。具体如下

mysql 5.7版本查询进行优化了,认为子查询中的order by可以进行忽略,只要Derived table里不包含如下条件就可以进行优化:

  • UNION clause
  • GROUP BY
  • DISTINCT
  • Aggregation
  • LIMIT or OFFSET

简单来说不想被优化就需要在子查询里添加上面的条件(仅仅是用作不被优化)

最简单的也就是 limit 或者group by 了

但是limit有个限制,如果查询fund_code很多  并且数据量非常大 比如上百万、上千万的数据 在用limit的时候  就要尽可能大了,不然有可能最新日期排名靠后的fund_code匹配不到数据

select * from (select fund_code,fund_date from t_table1 order by fund_date limit 1000000 ) a  group by fund_code;

另外就是 sql里面加上 limit 1000000有点丑了

所以比较倾向于group by 的写法,如下

select * from (select fund_code,fund_date from t_table1 group by fund_code,fund_date order by fund_date  ) a  group by fund_code;

当然在子查询用max函数先查询fund_code的最新日期,在根据查询到的fund_date、fund_code匹配下数据也能实现要查询的结果。但是之前版本的  order by ...group by ...组合实在是太好用了,并且比较简洁  不忍舍弃

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值