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

求助:MySQL关联查询获取transaksi_detail表最新日期数据

解决主从表关联并获取每组最新日期数据的问题

我来帮你搞定这个需求!你需要关联pinjaman(主表)和transaksi_detail(从表),并按pinjid分组,只保留从表中每个pinjid对应的最新tanggal(日期)记录,下面给你两种实用的解法:

方法一:子查询获取每组最大日期后关联

这种方法兼容性好,几乎所有数据库都支持,思路是先找出每个pinjid对应的最新日期,再通过这个日期筛选从表的记录,最后和主表关联:

SELECT p.*, td.*
FROM pinjaman p
-- 关联主表和从表
JOIN transaksi_detail td ON p.pinjid = td.pinjid
-- 关联子查询得到的每个pinjid的最新日期
JOIN (
    SELECT pinjid, MAX(tanggal) AS latest_tanggal
    FROM transaksi_detail
    GROUP BY pinjid
) td_latest ON td.pinjid = td_latest.pinjid 
           AND td.tanggal = td_latest.latest_tanggal;

逻辑说明:

  1. 子查询td_latest先按pinjid分组,算出每个分组的最大日期latest_tanggal;
  2. 把transaksi_detail和td_latest关联,筛选出每个pinjid中日期等于最大日期的记录;
  3. 最后和主表pinjaman关联,得到合并后的完整数据。

方法二:用窗口函数(推荐,适合支持窗口函数的数据库)

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这种方法更简洁直观,还能灵活处理“同日期多条记录”的场景:

SELECT p.*, td.*
FROM pinjaman p
JOIN (
    SELECT *,
           -- 按pinjid分组,每组按日期倒序排,给每条记录标序号
           ROW_NUMBER() OVER (PARTITION BY pinjid ORDER BY tanggal DESC) AS rn
    FROM transaksi_detail
) td ON p.pinjid = td.pinjid
-- 只取每组序号为1的记录(也就是最新日期的那条)
WHERE td.rn = 1;

额外说明:

  • 如果同一个pinjid在最大日期有多条记录,上面的ROW_NUMBER()只会返回其中一条;
  • 要是想返回所有同日期的记录,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。

优化小提示

  • 给transaksi_detail表的pinjid和tanggal字段加联合索引,能大幅提升查询速度;
  • 确保tanggal字段是日期/日期时间类型,避免因类型不一致导致的MAX()计算错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:08:37