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

MySQL 5.X关联表查询每个idProcess对应的最后2条idTrace记录

MySQL多表分组取Top N兼容空关联查询方案

实现思路

  • 使用LEFT JOIN关联两张表,确保Processes表中没有对应Tracings记录的行也能完整返回
  • 按idProcess分组后对idTrace倒序排序,取每组前2条记录即可得到每个进程最新的2条跟踪ID
  • 分别提供MySQL 8.0+窗口函数实现方案,以及兼容MySQL 5.x的低版本实现方案

MySQL 8.0及以上版本方案(推荐)

直接使用窗口函数ROW_NUMBER()实现分组排序取数,性能更优:

SELECT 
    p.idProcess,
    p.data,
    t.idTrace
FROM 
    Processes p
LEFT JOIN (
    SELECT 
        idTrace,
        idProcess,
        ROW_NUMBER() OVER (PARTITION BY idProcess ORDER BY idTrace DESC) AS row_num
    FROM Tracings
) t ON p.idProcess = t.idProcess AND t.row_num <= 2
ORDER BY p.idProcess, t.idTrace DESC;

内层子查询会给每个idProcess下的所有idTrace按倒序生成行号,外层关联时只过滤行号小于等于2的记录,没有关联跟踪记录的进程返回的idTrace为NULL,完全符合需求。

MySQL 5.x兼容版本方案

低版本没有窗口函数,用关联子查询实现相同逻辑:

SELECT 
    p.idProcess,
    p.data,
    t.idTrace
FROM 
    Processes p
LEFT JOIN Tracings t ON p.idProcess = t.idProcess
WHERE 
    (
        SELECT COUNT(*) 
        FROM Tracings t2 
        WHERE t2.idProcess = t.idProcess AND t2.idTrace >= t.idTrace
    ) <= 2
    OR t.idTrace IS NULL
ORDER BY p.idProcess, t.idTrace DESC;

子查询统计同个进程下比当前idTrace数值更大的记录数,统计结果小于等于2就说明是最新的2条记录,同时保留idTrace为NULL的无关联记录。

内容的提问来源于stack exchange,提问作者Diego La Rosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:45:02