MySQL:获取分组最新记录并关联另一表数据的查询实现
解决方案:关联库存表与最新采购记录
没问题,我来帮你搞定这个查询需求!你需要的是让每条库存记录只关联对应采购单的最新采购信息(也就是同purchase_id下keyid最大的那条采购记录),下面给你两种实用的解决方案:
方法一:使用子查询获取每个采购单的最新记录ID
这种方法兼容性好,适合所有MySQL版本:
SELECT s.keyid, s.purchase_id, s.status, p.brand, p.model, p.keyid AS purkeyid FROM tStockMP AS s -- 关联采购表 JOIN tPurchases AS p ON s.purchase_id = p.purchase_id -- 关联子查询:先找出每个purchase_id对应的最大keyid(最新采购记录) JOIN ( SELECT purchase_id, MAX(keyid) AS max_keyid FROM tPurchases GROUP BY purchase_id ) AS latest_pur ON p.purchase_id = latest_pur.purchase_id AND p.keyid = latest_pur.max_keyid;
逻辑说明:
- 子查询
latest_pur按purchase_id分组,计算每个采购单的最大keyid,得到每个采购单的最新记录ID; - 将库存表、采购表与这个子查询关联,确保只筛选出采购表中
keyid等于对应采购单最大keyid的记录,也就是最新的采购信息。
方法二:使用窗口函数(MySQL 8.0+ 推荐)
如果你的MySQL版本是8.0及以上,窗口函数会更简洁直观:
SELECT s.keyid, s.purchase_id, s.status, p.brand, p.model, p.keyid AS purkeyid FROM tStockMP AS s -- 关联处理后的采购表:给每个采购单的记录按keyid倒序排号,最新的记录序号为1 JOIN ( SELECT *, ROW_NUMBER() OVER (PARTITION BY purchase_id ORDER BY keyid DESC) AS rn FROM tPurchases ) AS p ON s.purchase_id = p.purchase_id AND p.rn = 1;
逻辑说明:
- 用
ROW_NUMBER()窗口函数,按purchase_id分组(PARTITION BY purchase_id),每组内按keyid倒序排序(ORDER BY keyid DESC),给每条记录分配一个序号rn; - 最新的采购记录序号为1,关联时只取
rn=1的记录,就能得到每个库存记录对应的最新采购信息。
两种方法都能得到你想要的预期结果,你可以根据自己的MySQL版本选择合适的方案。
内容的提问来源于stack exchange,提问作者aarelovich
相关产品推荐
相关产品推荐

