sql 子查询 获取不到父id_数据库Group by子查询order by排序失效问题分析

当使用SQL的GROUP BY进行分组查询时,若要获取每组的最大ID,会遇到子查询中的ORDER BY排序无效的问题。原因是MySQL 5.6及以上版本对子查询优化导致。解决方法是在子查询中添加LIMIT,或者通过关联子查询来获取每个分组的最后一条记录。本文探讨了不同实现方式,并邀请读者分享更多解决方案。
摘要由CSDN通过智能技术生成
8c408ce5d5d6dc00f12cc62190a0edae.png

通过sql分组查询数据时,一般通过group by来完成,group by默认取相同的分组列(一列或者多列)中第一个数据。

如果想获取sql分组中id最大的记录,我们可能想到的sql如下(name列作为分组):

select id,name from (select id,name from tt order by id desc) as t group by name

不过执行该sql发现并不能达到我们的目的,输出数据如下:

// 表数据如下:id,name1,name12,name13,name24,name2select id,name from (select id,name from tt order by id desc) as t group by name// 输出结果如下:id,name1,name13,name2

这是为什么呢?因为mysql 5.6之后版本对排序的sql解析做了优化,子查询中的排序是会被忽略的,所以上面的order by id desc未起到作用。如果子语句中排序不做优化那不就可以了么,查阅资料发现可以在子语句中加上limit来避免这种优化(加上limit相当于临时表限定了取值范围不会进行优化,如果是全表的话就被优化掉了)。

// 加上limitselect id,name from (select id,name from tt order by id desc limit 1024) as t group by name// 输出结果如下:id,name2,name14,name2

除了上述这种直接通过group by分组得到id最大记录之外,还可以通过分组获取到最大记录id,然后通过id获取对应记录(这里的id只要是记录的关键key即可)。

// 通过分组获取关键key,然后再获取对应记录select id,name from tt where id in (select max(id) from tt group by name)// 输出结果如下:id,name2,name14,name2

其实除了group by获取分组最后一个记录之外,还可以通过关联子查询方式来实现:

select id,name from tt a where id = (select max(id) from tt where name = a.name) order by name// 输出结果如下id,name2,name14,name2

通过以上group by和关联子查询几种方式的实现,获取分组的最后一条记录要么直接通过分组直接来获取,要么先获取到记录关键key然后通过关键key获取对应的记录即可。如果小伙伴还知道更多的实现方式,欢迎留言一起讨论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值