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

 更新时间:2024年11月20日 10:53:29   作者:乔丹搞IT  
本文介绍了五种在MySQL中获取每个分组最新一条数据的方法,包括子查询和JOIN、窗口函数、变量、聚合函数和子查询以及使用DISTINCT关键字,推荐使用子查询和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操作或者窗口函数,这些方法更清晰、效率更高。

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL中的约束Constraint解读

    MySQL中的约束Constraint解读

    这篇文章详细介绍了MySQL中的各种约束类型,包括非空约束、默认约束、检查约束、唯一约束和主键约束,以及外键约束,每种约束类型都有其特定的用途和语法,并且可以是列级约束或表级约束,文章还探讨了如何给约束命名、删除约束
    2025-01-01
  • mysql 8.0.20 winx64.zip压缩版安装配置方法图文教程

    mysql 8.0.20 winx64.zip压缩版安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.20 winx64.zip压缩版安装配置方法图文教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Mysql查询时间区间日期列表实例代码

    Mysql查询时间区间日期列表实例代码

    最近常用到mysql的日期范围搜索,下面这篇文章主要给大家介绍了关于Mysql查询时间区间日期列表的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • mysql 数据插入优化方法之concurrent_insert

    mysql 数据插入优化方法之concurrent_insert

    在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的
    2021-07-07
  • 阿里云ECS centos6.8下安装配置MySql5.7的教程

    阿里云ECS centos6.8下安装配置MySql5.7的教程

    阿里云默认yum命令下的MySQL是5.17****,安装mysql5.7之前先卸载以前的版本。下面通过本文给大家介绍阿里云ECS centos6.8下安装配置MySql5.7的教程,需要的的朋友参考下吧
    2017-07-07
  • MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研究了一下MYSQL的随机抽取实现方法
    2011-11-11
  • Linux下安装MySQL教程

    Linux下安装MySQL教程

    上一篇文章详细介绍windows下MySQL安装教程,这篇就从最基本的安装MySQL-Linux环境开始,文章为绕MySQL安装展开内容,需要的朋友可以参考一下
    2021-11-11
  • 解决myBatis中删除条件的拼接问题

    解决myBatis中删除条件的拼接问题

    这篇文章主要介绍了解决myBatis中删除条件的拼接问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • mysql连接错误2013的问题及解决

    mysql连接错误2013的问题及解决

    这篇文章主要介绍了mysql连接错误2013的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Windows7下安装使用MySQL8.0.16修改密码、连接Navicat问题

    Windows7下安装使用MySQL8.0.16修改密码、连接Navicat问题

    这篇文章主要介绍了Windows7下安装使用MySQL8.0.16修改密码、连接Navicat问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06

最新评论