获取多表关联查询结果中的最新记录
多表关联获取最新记录的解决方案
先理清楚咱们的表关联逻辑:
ATable存储对象A的基础信息,a_id是主键BTable存储属于A的对象B,通过a_id和ATable关联,b_id是B的主键CTable存储属于B的对象C,通过b_id和BTable关联,c_id是C的主键ValueTable记录每个B-C组合的历史值,date字段标记记录时间,我们要取每个组合的**最新(date最大)**记录
通用SQL方案(基于窗口函数)
如果要获取指定组合的最新记录——比如指定某个a_id、某个b_id,甚至特定的b_id+c_id组合,用窗口函数ROW_NUMBER()分组排序是最简洁高效的方式:
WITH RankedValues AS ( SELECT a.a_id, a.a_name, b.b_id, b.b_name, c.c_id, c.c_name, v.value, v.date, -- 按b_id和c_id分组,按date降序排名,最新记录排第1 ROW_NUMBER() OVER (PARTITION BY b.b_id, c.c_id ORDER BY v.date DESC) AS rn FROM ATable a JOIN BTable b ON a.a_id = b.a_id JOIN CTable c ON b.b_id = c.b_id JOIN ValueTable v ON b.b_id = v.b_id AND c.c_id = v.c_id -- 这里添加指定组合的过滤条件,比如只查a_id=1的记录 WHERE a.a_id = 1 ) SELECT a_id, a_name, b_id, b_name, c_id, c_name, value, date FROM RankedValues WHERE rn = 1;
不同指定场景的调整
- 若仅需指定
b_id,把WHERE条件改成b.b_id = 2即可 - 若需指定特定
b_id+c_id组合,改成WHERE b.b_id = 1 AND c.c_id = 1 - 若要获取所有组合的最新记录,直接去掉
WHERE子句就行
备选方案(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.7及以前),可以用子查询先找到每个b_id+c_id的最大date,再关联回主表:
SELECT a.a_id, a.a_name, b.b_id, b.b_name, c.c_id, c.c_name, v.value, v.date FROM ATable a JOIN BTable b ON a.a_id = b.a_id JOIN CTable c ON b.b_id = c.b_id JOIN ValueTable v ON b.b_id = v.b_id AND c.c_id = v.c_id JOIN ( SELECT b_id, c_id, MAX(date) AS max_date FROM ValueTable GROUP BY b_id, c_id ) v_max ON v.b_id = v_max.b_id AND v.c_id = v_max.c_id AND v.date = v_max.max_date -- 同样添加指定组合的过滤条件 WHERE a.a_id = 1;
这两种方案都能精准获取每个B-C组合的最新记录,同时关联上A、B、C的基础信息,完全匹配你的需求~
内容的提问来源于stack exchange,提问作者Turbo123
相关产品推荐
相关产品推荐

