【问题标题】:MYSQL joining 3 tables with left join [duplicate]MYSQL用左连接连接3个表[重复]
【发布时间】: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_trimesterincidents.id_trimester 所做的那样。它使您的代码对其他人更具可读性(并且使用周到的别名更有帮助)。

标签: php mysql sql join left-join


【解决方案1】:

问题是您创建的关系重复了很多行。

我个人的做法是:

  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 ...

【讨论】:

  • 它说我不知道​​类列...
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 2012-12-04
  • 2011-12-22
  • 2018-12-27
  • 2014-10-29
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多