MySQL 排序分组获取最新一条记录

需求

获取 MySQL 表中修改最新的一条记录,在没有修改时间的时候获取添加时间最新的一条记录,将需求简化后如下图:
在这里插入图片描述
通过SQL得到红框的id为3、4的记录!

实践过程
SELECT t.* FROM (
    SELECT * FROM t_user ORDER BY create_time DESC, modify_time DESC
) AS t
GROUP BY t.username;

MySQL 版本为 5.6.16 下,执行正常,可以得到红框结果。
但是在 5.7.248.0.15 均报错:

1 queries executed, 0 success, 1 errors, 0 warnings

查询:select t.* from ( select * from t_user order by create_time desc ,modify_time DESC ) as t group by t.username LIMIT 0, 1000

错误代码: 1055
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

执行耗时   : 0 sec
传送时间   : 0 sec
总耗时     : 0 sec

提示是sql_mode的缘故;
错误原因:在MySQL5.7之后,sql_mode中默认存在ONLY_FULL_GROUP_BY,SQL语句未通过ONLY_FULL_GROUP_BY语义检查所以报错-------引用自MySQL-[Err] 1055 - Expression #1
ONLY_FULL_GROUP_BY:ONLY_FULL_GROUP_BY要求select语句中查询出来的列必须是明确的(其他语句也是一样)。

解决方案

1、查询 sql_mode;

SELECT @@sql_mode;

2、复制查询的结果,删除ONLY_FULL_GROUP_BY后,重新赋值:

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

在这里插入图片描述
3、查询
在这里插入图片描述
按照原语句查询,虽然不报错,但是得到的是 id为1,4,并不是我们想要的

4、改造

添加 LIMIT 10000

SELECT t.* FROM (
    SELECT * FROM t_user ORDER BY create_time DESC ,modify_time DESC 
    LIMIT 10000
) AS t
GROUP BY t.username;

在这里插入图片描述
limit 的非官方解释:
子查询的排序被mysql优化掉了,因为外部查询需要分组,mysql认为子查询排序是没有意义的,但是加了limit子查询排序就有意义----引自mysql 先排序分组 取组里面最新一条数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值