Php 在MYSQL查询和左连接上显示空值
我有一个疑问:Php 在MYSQL查询和左连接上显示空值,php,mysql,join,row,left-join,Php,Mysql,Join,Row,Left Join,我有一个疑问: SELECT pupils.id_pupil , name , surname , (select round(avg(qualifications.calificacion),2) from qualifications where id_pupil = pupils.id_pupil and qualifications.id_trimester=incidents.id_trimester and type_qualification='class')
SELECT
pupils.id_pupil
, name
, surname
, (select round(avg(qualifications.calificacion),2) from qualifications where id_pupil = pupils.id_pupil and qualifications.id_trimester=incidents.id_trimester and type_qualification='class') as media
, (select count(calificacion) from qualifications where id_pupil = pupils.id_pupil and qualifications.id_trimester=incidents.id_trimester and type_qualification='class') 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
WHERE
level=1
and class='A'
and id_trimester=1
GROUP BY id_pupil
表:
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)
它可以工作,但不显示四个值为0的未命中、延迟、姿态和未命中的行。那一行被省略了
如何显示所有行
谢谢 您的查询有一些问题。我做了一个修改,也许你能给你想要的结果。也许你应该把你的名字、姓氏、媒体和计算值放在你的群组中,但这取决于你的需求
SELECT
pupils.id_pupil
, name
, surname
, IFNULL(qua.media, 0) media
, IFNULL(qua.count, 0) count
, sum( case when type_incident='miss' then 1 else 0 end ) as misses
, sum( case when type_incident='delay' then 1 else 0 end ) as delays
, sum( case when type_incident='attitude' then 1 else 0 end ) as attitude
, sum( case when type_incident='miss_justif' then 1 else 0 end )
as misses_justificadas
FROM
pupils
LEFT JOIN incidents ON incidents.id_pupil=pupils.id_pupil
LEFT JOIN
(select id_pupil, id_trimester,
count(qualification) count,
round(avg(qualifications.qualification),2) media
from qualifications
where type_qualification='class'
group by id_pupil, id_trimester ) as qua
ON ( qua.id_pupil = pupils.id_pupil )
WHERE
level=1
and class='A'
and qua.id_trimester=1
GROUP BY pupils.id_pupil
你的算术全搞糟了。您在where语句中的条件与SUM语句中的条件完全相同。您可以发布事件表吗?@RubenGiaquinto我已经发布了该表。在这种情况下,您没有得到任何记录的原因是,您的where子句检查id_trimester,该id_trimester位于连接事件表的左侧。如果没有事件,这个字段有一个空值,所以实际上您已经通过检查它是否为1完成了一个内部连接。您需要在子查询中检查它。但是我建议使用一些类似于@JorgeCampos下面给出的代码,这样就消除了select子句中的子查询。我猜你是西班牙人,我也是,如果你不介意我用西班牙语回答的话。El id_trimester=1 me falla ya que dice que es ambiguo。在基多,我的职能没有改变结果,这是一个0。我是萨尔塔岛上的一员,没有什么特别之处:S@AlonsoGonzálezNestal-如果qua.media为null,则可以使用IFNULL(qua.media,0)获得0的值。此时,在sqlfiddle上进行数据采样会很好。我认为这是因为事件中缺少值(因为它是一个左连接),而这
qua.id\u trimester=incents.id\u trimester
导致了这样的问题。也许你会像最初发布的那样使用subselect返回到旧的select,也许它会起作用。但是为了更好地帮助你,最好有sqlfiddle。别担心@JorgeCampos完成了95%的工作,值得表扬。