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

MySQL5.7下将fundamentals表最新记录关联到companies表的实现问询

适配MySQL 5.7版本的实现方案

方案1:关联子查询匹配最新时间

直接通过子查询取对应公司的fundamentals最新created_at做关联条件:

SELECT 
    c.*, f.*
FROM companies c
LEFT JOIN fundamentals f 
    ON f.companies_id = c.id
    AND f.created_at = (
        SELECT MAX(created_at) 
        FROM fundamentals 
        WHERE companies_id = c.id
    );

如果存在同一个公司有多条完全相同created_at的记录,上述语句会返回所有符合时间条件的记录。如果仅需要返回1条,可以增加id兜底判断:

SELECT 
    c.*, f.*
FROM companies c
LEFT JOIN fundamentals f 
    ON f.companies_id = c.id
    AND f.id = (
        SELECT MAX(id)
        FROM fundamentals 
        WHERE companies_id = c.id
        AND created_at = (SELECT MAX(created_at) FROM fundamentals WHERE companies_id = c.id)
    );

方案2:预聚合最新时间再关联

先通过子查询聚合出每个公司的最新时间,再二次关联fundamentals表取完整数据:

SELECT c.*, f.*
FROM companies c
LEFT JOIN (
    SELECT companies_id, MAX(created_at) AS latest_created
    FROM fundamentals
    GROUP BY companies_id
) AS latest_f 
    ON latest_f.companies_id = c.id
LEFT JOIN fundamentals f
    ON f.companies_id = c.id
    AND f.created_at = latest_f.latest_created;

MySQL 8.0+ 可选优化方案(窗口函数)

如果后续升级到MySQL 8.0及以上版本,可以使用ROW_NUMBER()窗口函数实现,写法更简洁,性能也更稳定:

WITH ranked_fundamentals AS (
    SELECT 
        *,
        -- 同公司下按创建时间倒序、id倒序排序,最新记录排名为1
        ROW_NUMBER() OVER (PARTITION BY companies_id ORDER BY created_at DESC, id DESC) AS rn
    FROM fundamentals
)
SELECT c.*, rf.*
FROM companies c
LEFT JOIN ranked_fundamentals rf
    ON rf.companies_id = c.id
    AND rf.rn = 1;

内容的提问来源于stack exchange,提问作者Carol.Kar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:12:04