翼度科技»论坛 编程开发 mysql 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
Mysql分组查询每组最新的一条数据


代码示例:
在MySQL中,获取每个分组的最新一条数据是一个常见的查询需求。
以下是五种实现该需求的方法:

1.使用子查询和JOIN

通过子查询先找出每个分组的最新记录的日期,然后通过JOIN操作连接原表来获取完整的记录。
  1. SELECT o.*
  2. FROM orders o
  3. INNER JOIN (
  4.     SELECT customer_id, MAX(order_date) AS latest_date
  5.     FROM orders
  6.     GROUP BY customer_id
  7. ) 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或更高版本,可以利用窗口函数
  1. ROW_NUMBER()
复制代码
来实现。
  1. SELECT *
  2. FROM (
  3.     SELECT *,
  4.     ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
  5.     FROM orders
  6. ) ranked_orders
  7. WHERE rn = 1;
复制代码
3.使用变量(不推荐)

虽然不推荐使用变量来处理这类问题,但作为一种可能的方法,可以通过自连接和变量来实现。
  1. SELECT t1.*
  2. FROM orders t1
  3. LEFT JOIN orders t2
  4. ON t1.customer_id = t2.customer_id AND t1.order_date < t2.order_date
  5. WHERE t2.customer_id IS NULL;
复制代码
4.通过聚合函数和子查询

使用聚合函数
  1. MAX()
复制代码
来获取每个分组的最新时间,然后通过子查询来获取对应的完整记录。
  1. SELECT *
  2. FROM orders
  3. WHERE (customer_id, order_date) IN (
  4.     SELECT customer_id, MAX(order_date)
  5.     FROM orders
  6.     GROUP BY customer_id
  7. );
复制代码
5.通过DISTINCT关键字

通过在子查询中使用
  1. DISTINCT
复制代码
关键字来打破MySQL语句优化,使排序生效。
  1. SELECT *
  2. FROM (
  3.     SELECT DISTINCT * FROM orders ORDER BY customer_id, order_date DESC
  4. ) AS latest
  5. GROUP BY customer_id;
复制代码
以上方法中,推荐使用子查询和JOIN操作或者窗口函数,这些方法更清晰、效率更高。
使用变量的方法虽然可行,但通常不是最佳实践。

总结

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

来源:https://www.jb51.net/database/331051e32.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具