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

如何关联两张表并按主表ID获取最新datetime记录?

需求说明

需要关联两张表,从第二张表中获取每个主表(第一张表)ID对应的最新date记录,且每个主表ID仅返回一条结果。

表结构与数据

主表(命名为terms)

idtitle
1a
2ac
3at

关联表(命名为term_contents)

idcontentauthordatefk_term
202Maecenas ut massa ...Renee Copnar2022-08-171
351Sociis natoque penatibus...Rhona Levesque2022-10-301
557Phasellus in felis...Kissie Blabber2022-09-111
383Maecenas tristique...Saunders Robet2022-08-182
429In sagittis dui...Jorey Strodder2022-12-212
655Maecenas ut massa...Sim Harrod2023-01-072

期望输出

每个主表ID仅返回一条最新记录:

contentauthordatefk_termtitle
Sociis natoque penatibus...Rhona Levesque2022-10-301a
Maecenas ut massa...Sim Harrod2023-01-072ac

解决方案

方法1:窗口函数ROW_NUMBER()(推荐)

适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库,逻辑清晰易维护:

SELECT tc.content, tc.author, tc.date, tc.fk_term, t.title
FROM (
    SELECT 
        *,
        -- 按主表ID分组,每组内按日期倒序排名
        ROW_NUMBER() OVER (PARTITION BY fk_term ORDER BY date DESC) AS rn
    FROM term_contents
) tc
JOIN terms t ON tc.fk_term = t.id
-- 筛选每组排名第一的记录(最新日期)
WHERE tc.rn = 1;

方法2:关联子查询

针对不支持窗口函数的旧版数据库(如MySQL 5.x),可以用该写法:

SELECT tc.content, tc.author, tc.date, tc.fk_term, t.title
FROM term_contents tc
JOIN terms t ON tc.fk_term = t.id
-- 匹配当前主表ID对应的最新日期记录
WHERE tc.date = (
    SELECT MAX(date) 
    FROM term_contents 
    WHERE fk_term = tc.fk_term
);

补充说明

  • 主表中id=3的记录因关联表无对应数据,不会出现在结果中,符合数据实际情况;若需保留所有主表记录,可将JOIN替换为LEFT JOIN,并按需处理NULL值。

内容的提问来源于stack exchange,提问作者fdignard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:09:24