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

MySQL无需GROUP BY查询各项目最大idEtape及关联字段方案

无需GROUP BY获取每个项目的最大阶段信息

原查询的问题分析

你的当前查询存在两个关键问题:

  1. 子查询select max(t.idEtape) from jegere.EtapexProjet计算的是**整个表的最大idEtape**,而非每个idProjet`对应的最大值,无法实现按项目分组取最大阶段的需求。
  2. 两张表直接用逗号连接未指定关联条件,会产生笛卡尔积,导致结果完全错误。

解决方案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的记录

预期结果

根据你提供的测试数据,查询结果应为:

idProjetidEtapenomEtapeLivrable
14Surveillance et MaîtriseRapport de performance
25ClôtureDocument de clôture du projet
33RéalisationExécution du plan du projet

内容的提问来源于stack exchange,提问作者jeffrey lefebvre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:20:36