MySQL中获取同时拥有id和primaryid最大值的数据行
嘿,这个需求很清晰,我来给你几个靠谱的实现方案!
首先先明确你的目标:从#temp表中取出同时拥有全局最大id值和全局最大primaryid值的那一行数据。先把你的测试环境代码贴出来,方便大家复现场景:
-- 创建临时表 create table #temp ( id int, primaryid int, data nvarchar(20), data_name nvarchar(30) ); -- 插入测试数据 insert into #temp values (1,1,'3223sfd','434'),(1,2,'sdfsd','dfsdfsd'), (1,3,'sdfs897d','898'),(1,4,'898','545'),(1,5,'898','uuyu'), (2,1,'3223sfd','434'),(2,2,'sdfsd','dfsdfsd'), (2,3,'sdfs897d','898'),(2,4,'898','545'),(2,5,'898','uuyu');
方案一:子查询直接筛选(最简洁)
这个写法简单直接,通过两个子查询分别拿到全局最大的id和primaryid,再筛选出同时满足这两个条件的行:
SELECT id, primaryid, data, data_name FROM #temp WHERE id = (SELECT MAX(id) FROM #temp) AND primaryid = (SELECT MAX(primaryid) FROM #temp);
适用场景:适合确定只有一行符合条件的简单场景,如果id和primaryid有索引,查询性能会非常出色。
方案二:窗口函数(更灵活)
如果你的业务场景中可能存在多行同时满足最大id+最大primaryid的情况(比如有两行都是id=2、primaryid=5),用窗口函数的写法会更灵活:
WITH RankedRecords AS ( SELECT id, primaryid, data, data_name, -- 按id降序、primaryid降序排名,排名第一的就是目标行 ROW_NUMBER() OVER (ORDER BY id DESC, primaryid DESC) AS record_rank FROM #temp ) SELECT id, primaryid, data, data_name FROM RankedRecords WHERE record_rank = 1;
小调整:如果想返回所有符合条件的行(而不是只取第一行),把ROW_NUMBER()换成RANK()即可:
WITH RankedRecords AS ( SELECT id, primaryid, data, data_name, RANK() OVER (ORDER BY id DESC, primaryid DESC) AS record_rank FROM #temp ) SELECT id, primaryid, data, data_name FROM RankedRecords WHERE record_rank = 1;
适用场景:需要扩展排序规则、或者可能存在多行符合条件的场景,后续调整逻辑只需要修改OVER()里的排序字段即可。
结果验证
以上几种方法在你的测试数据上,都会返回正确的目标行:
| id | primaryid | data | data_name |
|---|---|---|---|
| 2 | 5 | 898 | uuyu |
内容的提问来源于stack exchange,提问作者Niteesh Kumar
相关产品推荐
相关产品推荐

