求助: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;
逻辑说明:
- 子查询
td_latest先按pinjid分组,算出每个分组的最大日期latest_tanggal; - 把
transaksi_detail和td_latest关联,筛选出每个pinjid中日期等于最大日期的记录; - 最后和主表
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
相关产品推荐
相关产品推荐

