MySQL使用group by分组然后进行条件筛选获取每组最新数据

MySQL使用group by分组然后进行条件筛选

使用场景如下:对一张数据表数据进行select查询操作,要求:对消息类型进行分组,然后获取每种类型最新的一条信息
实现思路获取最新数据 一般数据表插入的时候ID主键一般都是自动递增的,所以最新数据ID肯定最大。
select查询语句实现步骤

select 查询目标数据 from table_name where 条件1 group by 分组字段 having 筛选条件 order by 排序字段 ASC/DESC limit 开始记录数 ,目标数据条数

group by分组有一点注意,分组之后返回数据是每组第一个数据(数据表从上而下依次查询),但是这个数据不一定是最新的。
解决方式1:
在分组之前进行按ID排序 ID大的在前 再分组获取每种类型第一个数据就是最新的

SELECT t.* FROM (SELECT * FROM message_detail ORDER BY id DESC LIMIT 100000000 ) t WHERE t.company_id = 1 GROUP BY t.message_kind_code 

limit不要写死 可以执行此SQL语句之前获取表总数作为参数传入近去。
这种方式可以实现题目需求 但是会有bug,千万级数据 很耗时间 因为有全表扫描。
解决方式二:对一进行优化

SELECT t1.* FROM ( 
    SELECT message_kind_code, MAX(id) id 
    FROM message_detail 
    WHERE company_id =8 
    GROUP BY message_kind_code )t 
    JOIN message_detail t1 ON t1.id = t.id 

括号内sql语句,先进行筛选where 用ID主键索引,避免全表扫描。对符合where条件的数据进行group by 分组 分组之后从中查询 数据信息类型,分组内ID最大的那个ID 即为最新数据哦。然后和表联立,让临时表和message_detail进行联立,ID相等,即从message_detail找到每组最大ID的数据即最新信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值