我有这些表:
- 步骤(stepId_ stepName)
- stepOfProject (idProject_、stepId_ dateofStart)
- 项目(IdProject_ idResponsable)
我想获得每个项目的最新步骤,它正在使用这个查询:
select stepName
from step
where step.step=(select max(idstep) from stepOfProject where idProject=1) ;
但它只适用于项目1;我想要得到所有投影
试试这个:
select s1.stepName, sp1.projectId
from steps s1
join stepOfProject sp1 on s1.stepId = sp1.stepId
left join stepOfProject sp2 on sp1.idProject = sp2.idProject
and sp2.stepId > sp1.stepId
where sp2.stepId is null
left join
在这里所做的是检查是否存在属于同一项目的另一个步骤,具有更高的stepId
。如果该记录存在,则该记录将从结果中排除(这就是sp2.stepId is null
所做的)。
这使得每个项目只剩下编号最高的stepId
。
也许我完全不明白你为什么要…我认为Nick是对的——为什么不使用group by,除非这是一个学术练习。
这将有助于有一些样本数据的预期结果,但缺乏:
select
idProjectSummary.idProject, step.step, step.stepName
from
step
join (
select idProject, max (idstep) as max_step
from stepOfProject
group by idProject ) as idProjectSummary on
step.step = idProjectSummary.max_step
我有一段时间没有使用MySQL了,但上次我使用它时,它不支持with
子句。
起初我以为你使用的是Sql Server,我会这样做:
select s.stepName, p.idProject
from step s
cross apply (select TOP 1 idProject from stepOfProject where idstep=s.step order by idstep desc) p
唉,MySql不支持APPLY操作符,所以你必须满足于此,这确实需要一个GROUP BY(尽管不清楚为什么要避免):
SELECT s.stepName, p.idProject
FROM step s
INNER JOIN (SELECT idProject, MAX(idstep) as idstep FROM stepOfProject GROUP BY idProject) p ON p.idstep = s.step