MySql下实现先排序后分组 -(转载)

本文解决了一个常见的SQL问题,即如何在查询中有效地结合使用OrderBy和GroupBy来获取用户最近的购买记录,并避免了使用GROUP_CONCAT和SUBSTRING_INDEX带来的效率低下问题。通过正确的语法和技巧,实现了数据的快速检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因个人工作上遇见一些问题,一直困惑于无法解决,昨日偶尔看见一个博主的方法,特地转载过来,用来备份,谢谢那位博主。

问题场景: 需要取用户截至查询时间最近时间对于的数据 比如购买的商品,但是同时因为维度关系,需要进行去重,比如跟进用户+用户类别去重。因此在库表底层的需要对时间进行排序,然后根据用户和类别进行去重。

其实就是 order by 和 group by的使用。
但是当我写出 在子查询order by 之后在外层查询写上group by 并不能取出最大/小的值。

因此当时曲线救国,使用

SUBSTRING_INDEX(
								GROUP_CONCAT(
									A.ID
									ORDER BY
										A.CreateTime DESC SEPARATOR '|'
								),
								'|',
								1
							)
	GROUP_CONCAT( A.ID  ORDER BY A.CreateTime DESC SEPARATOR '|' )

Group_concat函数是先根据创建时间进行排序,然后在全部合并在一起,以’|'分开
最后使用 SUBSTRING_INDEX函数取第一个字符串来达到目的。

但是这样的查询,在我的报表因使用很多个,导致报表运行过慢,查询时间过长。

(实际还有where条件句中使用max/min函数的方法,但是代码运行效率一样很差,还不如GROUP_CONCAT作为子查询方便)

而昨日,发现了,order by group by的正确使用发法。

————————————————
这里把链接放上:
作者:Whiterock_Lelik
来源:优快云
原文:https://blog.youkuaiyun.com/lglaljj123/article/details/79864188

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值