我在mysql和php方面没有足够的经验,但是我正在尝试开发一个学校成绩单,我正在尝试查询学生,他们的考试,科目和分数。在这种情况下,我有三个循环。第一个循环是给学生的,我用它来获取学生id,第二个循环是给考试的,我用它来获取考试id,最后一个循环是给科目的,我用它来获取科目id,我需要所有这些id来获取每个学生每门科目每门考试的分数。下面是环;
foreach ($students as $student_row){ //get each student's ID
$studentID = $student_row['studentID'];
foreach ($allExams as $allExam) { //get each exam's ID
$examID = $allExam['examID'];
foreach ($subjects as $subject){ //get each subject's ID
$subjectID = $subject['subjectID'];
$obtained_mark_query = $this->db->query("select * from mark
where mark.studentID = '$studentID' && mark.examID = '$examID' &&
mark.subjectID = '$subjectID'")->row()->mark; //to get mark for each student per exam per subject
}
}
}
我不知道真正的问题是什么,但是这个循环需要很长时间,返回一个特定班级的所有学生需要26秒,一个班级只有23个学生,4个考试,5个科目,所以我想知道当学生人数超过这些学生时会是什么样。请告诉我为什么会这样,除了循环我还能用什么。
2条答案
按热度按时间sigwle7e1#
与数据库的通信非常慢。假设你正在做饭,而你的数据库查询是去杂货店。你不会为每一种配料都做一次旅行-你会列出你需要的所有配料,这样你就可以只做一次旅行。
因此,您希望运行一个查询来获取此页上需要的所有记录。为了方便起见,您可以将“where”子句转换为单个查询的“order by”:
然后你可以在结果集中的一个循环中处理每个学生分数的输出或任何处理。
ltqd579y2#
代码逻辑中有两个主要问题:
您选择的每个字段
SELECT * FROM
这是非常低效的,请尝试只选择要使用的字段您在第三个嵌套循环中进行查询,因此不是只查询一次,而是对每个学生、每个考试、每个科目进行一次查询(比如2345=460次查询)
解决方案是重构代码和数据库,并在一个简单的查询中获取该信息,然后遍历返回的记录并处理信息服务器端。