Mysql组内排序

Mysql组内排序

说起组内排序上来就有人想说啦,不就搞个子查询就行啦嘛

其实这个方法我试过,根据我的业务是会全表扫描的,贼鸡儿慢

今天说的是另一种方法,先说一下要组内排序的需求

20170517033604889

ID 设备编码 创建时间
151869253765566464 865800045644967 2019-06-14 16:06:33
151869253765566465 865800045644967 2019-06-17 11:40:33
154392710449467392 865533030153500 2019-06-21 15:13:52

我一上来就没动脑子就写了SQL

1
2
3
SELECT * FROM t_xxx 
GROUP BY 设备编码
ORDER BY 创建时间 DESC

但是……事与愿违啊,这个排序根本就没发挥作用,是组外的时间排序

然后就只能考虑用子查询先排序,后分组

1
2
3
4
5
SELECT * FROM (
SELECT * FROM t_xxx
ORDER BY 创建时间 DESC
) tmp
GROUP BY 设备编码

可是然并卵,还是没有获取到最新的创建时间

image

那怎么办呢?只能另辟蹊径,从Having上下手?想了半天也没法整

在我思绪万千搜索满屏的CSDN的时候,发现了一个大佬的解决方案

在我这个胸无点墨的人心里只蹦出一个字

image

使用GROUP_CONCAT,将创建时间全部合并起来,然后再配合ORDER BY 创建时间,对组内时间排序

然后把GROUP_CONCAT 的字段SUB_STRING一下取第一个不就完事儿了嘛~

话不多说上SQL

1
2
3
4
5
SELECT 
设备编码,
SUBSTRING_INDEX(GROUP_CONCAT(创建时间 ORDER BY 创建时间 desc),',',1) last_time
FROM t_xxx
GROUP BY 设备编码

image

搞定!而且也走了我的索引

image

image