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

获取多表关联查询结果中的最新记录

多表关联获取最新记录的解决方案

先理清楚咱们的表关联逻辑:

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:55:19