需求
现有一需求,根据id/name/login_name/created_at字段查询结果后,需要将查询出来的记录根据id和name分组后,在组内选择时间created_at最小的那一个login_name
根据id/name分组之后,login_name会有多个,组内时间也会不同;组内id/name相同。
思路
SQL1中查询出全部记录,并且根据id和created_at拼接为新的字段k,在SQL2中过滤出符合条件的记录,并且根据id和created_at拼接为新的字段;最后在SQL3中,根据字段k去查询过滤出符合条件的记录。
1、原有SQL查询-SQL1
原有SQL查询出来全部结果,其中
select rs.id,rs.name,u.login_name,u.created_at
from t_remote_station rs
left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1
order by rs.id,u.created_at asc
结果如下(共有31条记录,其中有几个需要过滤):

共有31条数据
2、修改SQL-SQL2
select rs.id,rs.name,MIN(u.created_at) created_at
from t_remote_station rs left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1
group by rs.id,rs.name

分组之后获取24条数据
3、获取每组内时间最小的那条记录-SQL3(符合要求的SQL)
select a.id,a.name,a.login_name,a.created_at from (
select rs.id,rs.name,u.login_name,u.created_at,CONCAT(rs.id,u.created_at) as k
from t_remote_station rs
left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1
order by rs.id,u.created_at asc) a
where a.k in (
select CONCAT(b.id,b.created_at) from (
select rs.id,rs.name,MIN(u.created_at) created_at
from t_remote_station rs left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1
group by rs.id,rs.name) b );

最后获取符合要求的24条数据