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
相关产品推荐
相关产品推荐

