我正在开展一个项目,根据所选日期和从下拉列表中选择的教师加载学生列表。该列表包含那些班级老师是教师选择的学生数据。现在我使用以下查询:
select s.studentcode,s.studentname,a.attdate,if(a.period='01' or
a.period='AM',a.status,'') as attAM,if(a.period='PM',a.status,'') as attPM
from tblstudent s left join tblattendance a on s.studentcode=a.studentcode
where s.classcode='10002' and a.attdate='2014-04-11'
现在上面问题的问题是,如果我选择了像2014-04-15这样的日期,那么由于没有为此日期标记出勤率,那么找不到记录,但我希望学生列表始终显示,如果出勤被标记为该日期,则应相应地显示,否则这些字段将为空白
上面的屏幕截图显示了我想要的列表。如果该日期的出勤没有被标记,并且如果被标记它应该包含相应的出勤,那么字段AM应该是空白的
答案 0 :(得分:1)
将AND a.attdate = '2014-04-11'
移动到join的ON()子句,如果日期不存在,它仍然会返回s.classcode = '10002'
的记录,而a.attdate
列在结果集中将为null,其中filter应用于整个结果集,其中在连接中使用附加条件将过滤右表中的记录,即tblattendance
而不是整个结果集
SELECT
s.studentcode,
s.studentname,
a.attdate,
IF(
a.period = '01'
OR a.period = 'AM',
a.status,
''
) AS attAM,
IF(a.period = 'PM', a.status, '') AS attPM
FROM
tblstudent s
LEFT JOIN tblattendance a
ON (s.studentcode = a.studentcode AND a.attdate = '2014-04-11')
WHERE s.classcode = '10002'