MySQL关联tracking与orders表查询每个姓名对应的最新trackingNumber记录
实现每个姓名仅返回最新物流单号的SQL方案
核心逻辑
- 首先对tracking表按姓名分组,取每个姓名对应的最新物流记录(默认tracking表id为自增主键,id越大记录越新)
- 用去重后的最新tracking记录与orders表关联,避免一对多关联产生重复订单数据
注:你原SQL中的关联条件
t.name = o.name OR o.name = t.name等价于t.name = o.name,属于重复冗余条件,可直接简化。
方案1:MySQL 8.0及以上版本(支持窗口函数)
使用ROW_NUMBER()窗口函数按姓名分组,按id倒序排序后取每个分组的第一条记录即可:
WITH latest_tracking AS ( SELECT id, name, trackingNumber, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn FROM tracking ) SELECT o.id AS order_id, o.OrderNumber, o.Name, lt.trackingNumber AS latest_tracking_number FROM orders o LEFT JOIN latest_tracking lt ON o.Name = lt.name AND lt.rn = 1 -- 仅需返回有物流记录的订单时,将LEFT JOIN修改为INNER JOIN即可
方案2:MySQL 5.x等低版本(不支持窗口函数)
通过子查询先获取每个姓名对应的最大id,再关联取对应物流单号:
SELECT o.id AS order_id, o.OrderNumber, o.Name, t.trackingNumber AS latest_tracking_number FROM orders o LEFT JOIN ( SELECT t1.* FROM tracking t1 INNER JOIN ( SELECT name, MAX(id) AS max_id FROM tracking GROUP BY name ) t2 ON t1.name = t2.name AND t1.id = t2.max_id ) t ON o.Name = t.name -- 仅需返回有物流记录的订单时,将LEFT JOIN修改为INNER JOIN即可
两种方案执行后,John Doe会返回id=2对应的最新物流号1Z21343V43DF4435,Mark Jacobs返回id=6对应的1Z21343V43DF4438,完全满足每个姓名仅返回一条最新物流记录的需求。
内容的提问来源于stack exchange,提问作者rbur0425
相关产品推荐
相关产品推荐

