MYSQL多对多表按UserId去重并保留最新记录的实现问题
解决方案
方法1:窗口函数(兼容MySQL 8.0+/PostgreSQL/SQL Server等所有主流新版数据库)
这是最通用、易维护的实现方式,通过排序编号直接筛选每个用户的最新记录:
SELECT UserId, DomicilioId, FechaCambio, Observaciones FROM ( SELECT *, -- 按用户ID分组,组内按变更时间倒序排序 ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY FechaCambio DESC) AS rn FROM 你的实际表名 ) t -- 取每个用户排序后的第一条(最新记录) WHERE rn = 1;
如果存在同一个用户同一时间有多条变更记录的场景,可以将ROW_NUMBER()替换为RANK(),或额外增加排序条件适配业务规则。
方法2:关联子查询(兼容低版本数据库,如MySQL 5.x)
如果你的数据库不支持窗口函数,可以先统计每个用户的最新变更时间,再关联回原表取完整记录:
SELECT t1.* FROM 你的实际表名 t1 INNER JOIN ( -- 先取每个用户的最新变更时间 SELECT UserId, MAX(FechaCambio) AS max_fecha FROM 你的实际表名 GROUP BY UserId ) t2 ON t1.UserId = t2.UserId AND t1.FechaCambio = t2.max_fecha;
注意该方法如果同一个用户存在多条完全相同FechaCambio的记录,会全部返回,可根据业务需求补充额外去重条件。
方法3:直接删除表内重复记录,仅保留最新数据
如果你的需求是直接对原表做数据清理,而非仅查询结果,可以使用如下写法(以MySQL为例):
DELETE t1 FROM 你的实际表名 t1 JOIN 你的实际表名 t2 ON t1.UserId = t2.UserId -- 删除同一个用户中变更时间早于最新时间的所有记录 AND t1.FechaCambio < t2.FechaCambio;
内容的提问来源于stack exchange,提问作者Francisco Jarma
相关产品推荐
相关产品推荐

