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 ...组合实在是太好用了,并且比较简洁 不忍舍弃