You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:39:00