如何在不使用GROUP BY的情况下解决此OPERATION" SQL"

时间:2015-07-28 02:15:36

标签: mysql sql

我有这些表格:

  • 步骤(stepId_,stepName)
  • stepOfProject(idProject_,stepId_,dateofStart)
  • 项目(IdProject_,idResponsable)

我想在使用此查询的每个项目中获取最新步骤:

select stepName 
from step 
where step.step=(select max(idstep) from stepOfProject where idProject=1) ; 

但它只是为1号项目工作;我想获得所有projectId。

3 个答案:

答案 0 :(得分:0)

试试这个:

   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

答案 1 :(得分:0)

也许我完全不理解为什么你会这么做...我认为尼克是对的 - 为什么不使用小组,除非这是一个学术练习。

将一些样本数据作为预期结果会有所帮助,但不足以:

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子句。

答案 2 :(得分:0)

起初我以为你在使用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