如何在一对多关系中获取指定用户的最新单条合同记录?
获取指定用户各自的最新合同查询方案
你原来的查询用LIMIT 1只会返回整个筛选结果里的第一条记录,而不是每个用户的最新合同。以下两种常用方案可以解决这个问题:
方法一:使用窗口函数(推荐,适用于支持窗口函数的数据库:MySQL 8+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数按用户分组,每组内按合同签署日期倒序排序,取每组的第一条记录:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY userid ORDER BY signingdate DESC) AS row_num FROM contract WHERE userid IN (123, 143, 153, 163) ) AS ranked_contracts WHERE row_num = 1;
- 逻辑说明:
PARTITION BY userid将数据按用户分组,ORDER BY signingdate DESC让每组内最新的合同排在最前面,ROW_NUMBER()给每组的记录编号,最后筛选出编号为1的记录就是每个用户的最新合同。
方法二:使用关联子查询(兼容老版本数据库,如MySQL 5.x)
先找到每个指定用户的最新合同签署日期,再关联原表获取对应合同的完整信息:
SELECT c.* FROM contract c INNER JOIN ( SELECT userid, MAX(signingdate) AS latest_sign_date FROM contract WHERE userid IN (123, 143, 153, 163) GROUP BY userid ) AS latest_dates ON c.userid = latest_dates.userid AND c.signingdate = latest_dates.latest_sign_date;
- 逻辑说明:子查询先按用户分组,拿到每个用户的最大签署日期,再通过用户ID和日期关联原表,得到每个用户对应最新日期的合同。如果同一个用户在同一天有多份合同,这个方法会返回所有当天的合同;如果只需要其中一条,可以结合
LIMIT或者其他条件进一步筛选。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

