2015-07-28 4 views
0

У меня есть эти таблицы:Как разрешить эту операцию без использования GROUP BY в "SQL"

  • шаги (stepId_, stepName)
  • stepOfProject (idProject_, stepId_, dateofStart)
  • Project (IdProject_ , idResponsable)

Я хочу, чтобы получить последний шаг в каждом проекте работает с этим запросом:

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

Но он работает только для номера проекта 1; Я хочу получить для всех projectId.

+3

Почему вы не хотите использовать «группу»? – nick

+0

@nick Интересно, связана ли проблема с печально известной «Столбец« foo »Microsoft SQL Server в списке выбора, потому что она не содержится ни в агрегатной функции, ни в предложении GROUP BY». ошибка, даже если столбец-нарушитель имеет функциональную зависимость от столбца в предложении GROUP BY. –

+1

@tepples: это дефект (более ранних выпусков?) Стандартного SQL, а не просто проблема в SQL Server. То есть многие другие СУБД также налагают это ограничение, в конечном счете, потому что стандарт SQL говорит, что это должно произойти. –

ответ

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 для каждого проекта.

+0

спасибо большое, ребята, вопрос для Майка К, ваше предложение работает на 100%, я думаю, что мне нужно попытаться работать с JOIN прямо лучше, но я не знаю, что осталось от этого сделать в этом случае? и в этом случае, как объявление idProject в конечном результате, спасибо большое Майк – maro

+0

@maro: добавлено объяснение. Чтобы получить 'projectId', вам придется взять его из таблицы с псевдонимом как' sp1' (потому что результат 'sp2' будет пустым). –

+0

thaks много Майк да работает;) – maro

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 статья.

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