You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()里的排序字段即可。

结果验证

以上几种方法在你的测试数据上,都会返回正确的目标行:

idprimaryiddatadata_name
25898uuyu

内容的提问来源于stack exchange,提问作者Niteesh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:03:49