当前位置: 代码网 > it编程>数据库>Mysql > Mysql分组查询每组最新的一条数据的五种实现过程

Mysql分组查询每组最新的一条数据的五种实现过程

2024年11月21日 Mysql 我要评论
mysql分组查询每组最新的一条数据代码示例:在mysql中,获取每个分组的最新一条数据是一个常见的查询需求。以下是五种实现该需求的方法:1.使用子查询和join通过子查询先找出每个分组的最新记录的日

mysql分组查询每组最新的一条数据

代码示例:

在mysql中,获取每个分组的最新一条数据是一个常见的查询需求。

以下是五种实现该需求的方法:

1.使用子查询和join

通过子查询先找出每个分组的最新记录的日期,然后通过join操作连接原表来获取完整的记录。

select o.*
from orders o
inner join (
    select customer_id, max(order_date) as latest_date
    from orders
    group by customer_id
) latest_orders on o.customer_id = latest_orders.customer_id and o.order_date = latest_orders.latest_date;

2.使用窗口函数(mysql 8.0+)

如果你使用的是mysql 8.0或更高版本,可以利用窗口函数row_number()来实现。

select *
from (
    select *,
    row_number() over (partition by customer_id order by order_date desc) as rn
    from orders
) ranked_orders
where rn = 1;

3.使用变量(不推荐)

虽然不推荐使用变量来处理这类问题,但作为一种可能的方法,可以通过自连接和变量来实现。

select t1.*
from orders t1
left join orders t2
on t1.customer_id = t2.customer_id and t1.order_date < t2.order_date
where t2.customer_id is null;

4.通过聚合函数和子查询

使用聚合函数max()来获取每个分组的最新时间,然后通过子查询来获取对应的完整记录。

select *
from orders
where (customer_id, order_date) in (
    select customer_id, max(order_date)
    from orders
    group by customer_id
);

5.通过distinct关键字

通过在子查询中使用distinct关键字来打破mysql语句优化,使排序生效。

select *
from (
    select distinct * from orders order by customer_id, order_date desc
) as latest
group by customer_id;

以上方法中,推荐使用子查询和join操作或者窗口函数,这些方法更清晰、效率更高。

使用变量的方法虽然可行,但通常不是最佳实践。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com