MySQL关联两表获取各客户近6个月最新订单及客户信息
MySQL查询解决方案:获取客户近6个月最后一笔订单并关联客户信息
方法一:使用窗口函数(MySQL 8.0及以上版本适用)
利用ROW_NUMBER()窗口函数按客户分组,对订单日期倒序排序,直接定位每个客户的最新订单:
SELECT ci.customer_id, ci.customer_name, ol.order_date FROM (SELECT customer_id, order_date, -- 按客户分组,订单日期从新到旧排序,每组第一条标记为1 ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn FROM order_log WHERE -- 筛选近6个月的订单 order_date >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) ) AS ol -- 关联客户信息表 JOIN customer_info ci ON ol.customer_id = ci.customer_id -- 只保留每个客户的最新订单(排序后的第一条) WHERE ol.rn = 1;
方法二:子查询获取最大订单日期(兼容MySQL 5.x版本)
如果你的MySQL版本不支持窗口函数,可通过子查询先找出每个客户近6个月的最晚订单日期,再关联订单表和客户表:
SELECT ci.customer_id, ci.customer_name, ol.order_date FROM customer_info ci -- 关联订单日志表 JOIN order_log ol ON ci.customer_id = ol.customer_id -- 关联子查询得到的每个客户最新订单日期 JOIN ( SELECT customer_id, MAX(order_date) AS last_order_date FROM order_log WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY customer_id ) AS last_orders ON ol.customer_id = last_orders.customer_id AND ol.order_date = last_orders.last_order_date;
关于UNION关键字的误区
UNION的作用是合并多个独立查询的结果集,而你需要的是关联不同表获取关联数据,这属于表连接场景,应该用JOIN系列关键字,UNION并不适用于这个需求,所以之前尝试UNION会失败。
内容的提问来源于stack exchange,提问作者Nabil
相关产品推荐
相关产品推荐

