匿名用户
我不确定是否应该用这些更新来编辑问题。但这是我提出的部分解决方案。我会很高兴有人能帮助优化这个更多。
所以,我从这段代码开始。SELECT timeid
FROM timetable
WHERE flag > ?
AND semester = ?
AND section = ?
AND timeid BETWEEN ? AND ?
从上面的代码,我可以得到日期的类采取。接下来,我检查一个学生是否在下面提到的日期出席或缺席:SELECT attended FROM attendancetable
WHERE s_id = ?
AND semester = ?
AND timeid = ?
有了这个,我就可以看到一个学生是否缺席了。在php中,它看起来如下所示://Getting the dates
$query = "SELECT timeid FROM timetable
WHERE flag > ?
AND semester = ?
AND section = ?
AND timeid BETWEEN ? AND ?";
$params = array(0, 1, 'A', '2017-01-01', '2017-06-30' );
$stmt = $db->prepare($query);
$stmt->execute($params);
$dates = $stmt->fetchall();
//checking if students is present or absent
$query = "SELECT attended FROM attendancetable
WHERE s_id = ?
AND semester = ?
AND timeid = ?";
//Now I'm going to loop through the $dates
foreach($dates as $date){
$params = array(1, 'A', $date['timeid']);
$stmt = $db->prepare($query);
$stmt->execute($params);
$result = $stmt->fetchall();
($result) ? $present = 1 : $present = 0;
}
通过上面的方法,我能够计算出某一段的学生是否按照课程表出席/缺席某一节课。现在,如果我想要一节中的所有学生,我可以首先查询student_info表,然后为每个学生计算foreach循环SELECT class_roll FROM student_info
WHERE logYear = ?
AND section = ?
AND deleted = ?
ORDER BY class_roll LIMIT ?, ?
然后,每个学生都运行foreach循环,以检查他们是否缺席或在场。最后,我可以得到这个:
我在本地测试了大约200个学生的执行时间,当类只有39个时,执行时间大约为1.6秒。我也用以前的数据测试了一整个学期,代码超过30秒,触发了max_execution_time错误。到现在为止,我设定了每页25个学生数量的限制。
更新:max_execution_time错误似乎只在第一次运行时出现,但后来当我尝试重新生成它的not giving neyer错误时,完成任务所花的时间不到2秒。