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的数据即最新信息。