【发布时间】:2014-02-04 09:51:59
【问题描述】:
我有这些表:
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
但问题是,我必须得到的正确结果是:
我得到:
问题在于将课程资格和未命中的数量相乘(17x6(2 个未命中、1 个延迟、1 个态度和 2 个未命中)=102)),我不希望这样。我想要第一张图片中显示的正确信息。
你愿意帮我吗?
谢谢!
【问题讨论】:
-
您需要在子查询中进行聚合,然后加入。
-
我该怎么做呢?我不知道,对不起
-
这不是该问题的完全重复,但我的回答显示了如何使用子查询进行连接。
-
对所有列进行限定是一种很好的做法 - 就像您对
qualifications.id_trimester和incidents.id_trimester所做的那样。它使您的代码对其他人更具可读性(并且使用周到的别名更有帮助)。
标签: php mysql sql join left-join