2013-07-14 3 views
0

Привет, У меня возникла проблема с запросом, который когда-то работал. Мои навыки SQL не так уж хороши, не знаю, чего мне не хватает. Или если это правильный подход. Может быть, вместо этого используйте временную таблицу?SQL - проблема с наличием и группировкой

Основной смысл задан определенный временной интервал, мне нужно рассчитать наивысшую совокупность точек над 5 классами.

trialScores - сохраняет результаты/баллы, испытания, собака, человек и таблицы членов просто мета-данные

Classid 5 требуется другой диапазон дат

Вот мой запрос на MySQL

select 
    t.id, 
    d.id, 
    p.id, 
    p.firstname, 
    p.lastname, 
    d.id dogId, 
    d.dogName, 
    c.id, 
    c.class, 
    t.trialStartDate, 
    s.points, 
    if(c.id = 5, '2012-08-01', '2012-11-18') as startDate, 
    if(c.id = 5, '2013-07-31', '2013-12-31') as endDate, 
    SUM(ts.points) AS pointsAggregate 
from trialScores ts 
    inner join trials t on t.id = ts.trialId 
    inner join dogs d on d.id = ts.dogId 
    inner join people p on p.id = ts.personId 
    inner join classes c on c.id = ts.classId 
where t.deletedAt is null 
    and ts.deletedAt is null 
    and ts.memberAtTrial = 1 
    and d.omitFromTripleCrownDOY = 0 
    and t.associationId = 1   
GROUP BY p.id, ts.dogId, ts.classId 
having t.trialStartDate between startDate and endDate 
order by ts.classId, pointsAggregate desc 

Похоже, что это исправлено, слишком много в выборе, а не в группе ?:

select 
d.dogName, 
c.class, 
p.firstName, 
p.lastName,  
SUM(ts.points) AS pointsAggregate 
from trialScores ts 
inner join trials t on t.id = ts.trialId 
inner join dogs d on d.id = ts.dogId 
inner join people p on p.id = ts.personId 
inner join classes c on c.id = ts.classId 
where t.deletedAt is null 
and ts.deletedAt is null 
and ts.memberAtTrial = 1 
and d.omitFromTripleCrownDOY = 0 
and t.associationId = 1 
and t.trialStartDate between if(c.id = 5, '2012-08-01', '2012-11-18') and if(c.id = 5, '2013-07-31', '2013-12-31') 
GROUP BY ts.dogId, ts.classId 
order by ts.classId, pointsAggregate desc 
+1

В чем проблема с запросом, возникает ошибка? или вы не получаете ожидаемого результата? – user2510115

+0

Можете ли вы предоставить некоторые примеры данных и ожидаемые результаты? –

+0

Извините, никаких ошибок. Плохие результаты. Если я вручную просмотрю данные и сравню их, некоторые люди даже будут опущены из результатов, которые, как я знаю, должны быть там. Позвольте мне посмотреть, могу ли я создать sqlfiddle, может потребоваться мгновение – boyceofreason

ответ

0

Можете ли вы попробовать выполнить запрос ниже, и пусть это будет работа или нет?

select 
d.dogName, 
c.class, 
p.firstName, 
p.lastName,  
SUM(ts.points) AS pointsAggregate 
from trialScores ts 
inner join trials t on t.id = ts.trialId 
inner join dogs d on d.id = ts.dogId 
inner join people p on p.id = ts.personId 
inner join classes c on c.id = ts.classId 
where t.deletedAt is null 
and ts.deletedAt is null 
and ts.memberAtTrial = 1 
and d.omitFromTripleCrownDOY = 0 
and t.associationId = 1 
and t.trialStartDate between if(c.id = 5, '2012-08-01', '2012-11-18') and if(c.id = 5, '2013-07-31', '2013-12-31') 
GROUP BY ts.classId,p.firstName,p.lastName 
order by ts.classId, pointsAggregate desc 
+0

ОК, что происходит это дает мне верхний класс. Таким образом, я получаю 5 повторений, по одному на класс с агрегатом верхних точек. И совокупность/люди уходят. – boyceofreason

+0

Я отредактировал сообщение. Надеюсь эта работа :) – user2510115