2014-01-15 2 views
0

У меня есть эти таблицы:MYSQL присоединение 3 таблицы с левой присоединиться к

pupils: (id_pupil, name, surname, email, user, pass, level, class) 
incidents: (id_incidents, date, time, type_incident, comments, id_pupil, id_user, subject, id_trimester) 
qualifications: (id_qualification, qualification, date, time, subject, id_pupil, id_user, id_trimester, type_qualification) 

и я сделал этот запрос:

SELECT 
    pupils.id_pupil 
    , name 
    , surname 
    , round(avg(qualifications.calificacion),2) as average 
    , count(qualifications.calificacion) as count 
    , COALESCE(sum(type_incident='miss' and level=1 and class='A' and id_trimester=1),0) as misses 
    , COALESCE(sum(type_incident='delay' and level=1 and class='A' and id_trimester=1),0) as delays 
    , COALESCE(sum(type_incident='attitude' and level=1 and class='A' and id_trimester=1),0) as attitude 
    , COALESCE(sum(type_incident='miss_justif' and level=1 and class='A' and id_trimester=1),0) as misses_justificadas 
FROM 
    pupils 
    left join incidents   ON incidents.id_pupil=pupils.id_pupil 
    left join qualifications ON qualifications.id_pupil=pupils.id_pupil 
WHERE 
    level=1 
    and class='A' 
    and id_trimester=1 
    and type_qualification='class' 
    and qualifications.id_trimester=incidents.id_trimester 
GROUP BY id_pupil 

Но проблема в том, правильный результат я бы получить было бы быть:

enter image description here

И я получаю:

enter image description here

Проблема заключается в том, что мультипликативный число классов квалификации и промахи (17x6 (2 промаха, 1 задержки, 1 отношение и 2 misses_just) = 102)), и я не хочу, чтобы. Я хочу, чтобы правильная информация была показана на первом снимке.

Хотите обработать меня, пожалуйста?

Спасибо!

+0

Вам необходимо выполнить агрегацию в подзапросах, а затем joi n с этим. – Barmar

+0

И как я могу это сделать? Я не знаю, извините –

+0

Это не точный дубликат этого вопроса, но мой ответ показывает, как сделать соединение с подзапросом. – Barmar

ответ

0

Проблема в том, что отношения, которые вы создаете, дублируют множество строк.

Мой личный подход был бы:

  1. Сначала получите необходимые вам данные из incidents
  2. Присоединяйтесь что «подзапросов» к данным, необходимым от учеников и квалификации

Что-то вроде это:

select 
    p.id_pupil, p.name, p.surname, 
    (case 
     when type_incident = 'miss' and level = 1 and class='A' then incident_count 
     else 0 
    end) as misses, 
    (case 
     when type_incident = 'delay' and level = 1 and class='A' then incident_count 
     else 0 
    end) as delays, 
    (case 
     when type_incident = 'attitude' and level = 1 and class='A' then incident_count 
     else 0 
    end) as attitude, 
    (case 
     when type_incident = 'miss_justif' and level = 1 and class='A' then incident_count 
     else 0 
    end) as miss_justif 
from 
    pupils as p 
    left join (
     select id_pupil, class, id_trimester, type_qualification, avg(qualification) as q_avg 
     from qualifications 
     group by id_pupil, class, id_trimester, type_qualification 
    ) as q on p.id_pupil = q.id_pupil 
    left join (
     select id_pupil, class, type_incident, level, class, count(id_incidents) as incident_count 
     from incidents 
     group by id_pupil, id_trimester, incident, level, class 
    ) as i on p.id_pupil = i.id_pupil 
where ... 
+0

Он говорит, что я не знаю о столбце класса ... –

Смежные вопросы