MySQL无需GROUP BY查询各项目最大idEtape及关联字段方案
无需GROUP BY获取每个项目的最大阶段信息
原查询的问题分析
你的当前查询存在两个关键问题:
- 子查询
select max(t.idEtape) fromjegere.EtapexProjet计算的是**整个表的最大idEtape**,而非每个idProjet`对应的最大值,无法实现按项目分组取最大阶段的需求。 - 两张表直接用逗号连接未指定关联条件,会产生笛卡尔积,导致结果完全错误。
解决方案1:关联子查询(兼容所有MySQL版本)
使用NOT EXISTS子查询判断当前阶段是否为对应项目的最大阶段:
SELECT ep.idProjet, ep.idEtape, e.nomEtape, e.Livrable FROM jegere.EtapexProjet ep JOIN jegere.Etape e ON ep.idEtape = e.idEtape WHERE NOT EXISTS ( SELECT 1 FROM jegere.EtapexProjet ep2 WHERE ep2.idProjet = ep.idProjet AND ep2.idEtape > ep.idEtape )
逻辑说明:对于EtapexProjet中的每一行,检查是否存在同一项目下idEtape更大的记录。如果不存在,说明当前行就是该项目的最大阶段。
解决方案2:窗口函数(MySQL 8.0+支持)
利用窗口函数RANK()按项目分组并按idEtape降序排名,取排名第一的记录:
SELECT idProjet, idEtape, nomEtape, Livrable FROM ( SELECT ep.idProjet, ep.idEtape, e.nomEtape, e.Livrable, RANK() OVER (PARTITION BY ep.idProjet ORDER BY ep.idEtape DESC) AS rnk FROM jegere.EtapexProjet ep JOIN jegere.Etape e ON ep.idEtape = e.idEtape ) AS ranked WHERE rnk = 1
逻辑说明:
PARTITION BY ep.idProjet:按项目分组ORDER BY ep.idEtape DESC:组内按阶段ID降序排列RANK():为每组内的行分配排名,最大的阶段ID排名为1,最终筛选出排名为1的记录
预期结果
根据你提供的测试数据,查询结果应为:
| idProjet | idEtape | nomEtape | Livrable |
|---|---|---|---|
| 1 | 4 | Surveillance et Maîtrise | Rapport de performance |
| 2 | 5 | Clôture | Document de clôture du projet |
| 3 | 3 | Réalisation | Exécution du plan du projet |
内容的提问来源于stack exchange,提问作者jeffrey lefebvre
相关产品推荐
相关产品推荐

