2014-01-15 67 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与那。 – 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

它说我不知道​​班级专栏... –