问题描述
对于 SQL 搜索有一种场景尽管很少遇到,但是不可避免,就是对于数据进行分组,并且获取每一个分组中第一条数据。
本文给出可行的解决方案。
测试表结构
表字段主要是 id、name、type、date
create table test
(
id bigint auto_increment
primary key,
name varchar(20) not null,
type int not null,
date datetime null
);
插入一下数据
提出需求
获取 type=1,获取 name 和其对应的最早的 date值
问题解决
group by 之后无法获得差异化数据,所以可以先获取唯一id,然后通过多次套用的方式来解决。
即,根据 name 和 date 做第一次分类,组成临时表。
然后对这个临时表做第二次分类,获取每一类的的第一条数据
select name,min(date) from (
select name, date
from test
where type = 1
group by name, date
)tem
group by name
拓展-根据id最简单
如果我们需要获取整条数据,则可以使用 分组+id
select * from test where id in (
select min(id)
from test
where type = 1
group by name
)
总结
group by 支持 对一个字段做分类,然后最另一个字段做条件处理。
只要确保每次处理分类字段+该分类下唯一区分条件字段 即可不断缩小数据范围。如果最后得出的数据是主键值,则可以返回来获取完整数据行的值。