我在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名学生,四门考试和五门科目,所以我想知道当学生人数超过这些学生时会是什么样的情况。请知道它为什么会这样,我可以使用循环以外的任何想法。
代码的逻辑中有两个主要问题:
- 您正在使用
SELECT * FROM
选择每个字段,这是非常低效的,请尝试只选择要使用的字段 - 您在第三个嵌套循环中进行查询,因此您不是查询一次,而是为每个学生、每个考试、每个科目进行1次查询(如23*4*5=460次查询(
解决方案是重构代码、数据库,并在一个简单的查询中获取信息,然后迭代返回的记录并处理信息服务器端。
与数据库的通信非常缓慢。想象一下,你正在做饭,而你的数据库查询是去杂货店的旅行。你不会为每一种食材都旅行——你会列出你需要的所有食材,这样你就可以只旅行一次。
因此,您希望运行一个查询来获取此页面上所需的所有记录。为了更容易,您可以将"WHERE"子句转换为单个查询的"ORDERBY":
SELECT * FROM mark ORDER BY studentID, subjectID, examID;
然后,您可以在该结果集的单个循环中一个接一个地处理每个学生的分数的输出或任何处理。