Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL使用左连接连接3个表_Php_Mysql_Sql_Join_Left Join - Fatal编程技术网

Php MYSQL使用左连接连接3个表

Php MYSQL使用左连接连接3个表,php,mysql,sql,join,left-join,Php,Mysql,Sql,Join,Left Join,我有这些桌子: 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,

我有这些桌子:

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
但问题是,我必须得到的正确结果是:

我得到:

问题是,将班级资格证书的数量乘以17x62次未通过、1次延迟、1次态度和2次未通过的次数就等于102,我不希望这样。我想在第一张图片中显示正确的信息

你愿意帮我吗


谢谢

问题是您正在创建的关系复制了大量行

我个人的做法是:

首先,从事件中获取所需的数据 将该子查询连接到您需要的来自学生和资格的数据 大概是这样的:

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

您需要在子查询中进行聚合,然后加入子查询。我如何才能做到这一点?我不知道,抱歉,这并不是一个完全重复的问题,但我的回答显示了如何使用子查询进行联接。对所有列进行限定是一种很好的做法,就像您对qualifications.id\u trimester和events.id\u trimester所做的那样。它使你的代码对其他人来说更具可读性,使用经过深思熟虑的别名帮助更大。。。