PHP使用相同的$ result资源执行多种排序

时间:2016-10-07 21:10:44

标签: php mysql

我不确定这是如何工作的,但我有6000个学生分数属于约900名学生。我可以对这些数据执行几个选择功能以获得合理的答案,但我必须将该信息放入电子表格中以删除不符合标准的学生。还有更好的方法吗?

如果我第一次选择获取每个唯一的学生姓名,那么我可以对80以上的平均结果进行排序。这不是问题,但我想删除那些不符合此标准的人,然后为那些课程少于8门的学生做另一个选择,然后放弃。然后查看最终列表并删除任何没有英语80的学生。

我可以将每个作为单独的select语句执行,但我想存储每个结果并在下一步中使用它。最后,我想得到一份学生名单,其中包括平均80分,8门课程,英语80分钟......

我知道这是可能的(如果不是很疯狂)但是最好和最有效的方法是什么,6月标记将是24000标记所以我猜测使用6个选择查询不是最好的方法?我正在使用PHP和MYSQL。

我希望这是足够的信息,我真的很感激任何洞察力。

由于

PS这里是表结构:

table: students_marks
id  stud_id gr  student_#   year   course  term  mark per

415 31703   9   3100992316  2500    PHYE9   F1  78  78
416 31703   9   3100992316  2500    FR9     F1  50  50
417 31703   9   3100992316  2500    ENG9    F1  55  55 

student_unique
id   student_#   First   Last   gr 
50  3100992316  Amanda  B       9

我把它分成两个表只是为了让第一类对于独特的学生更容易,但在阅读下面的答案后,我发现将所有数据放入一个表可能会更好。哦,如果你想知道为什么标记和百分比,IB有7个标记,所以在进行计算时它们必须转换成正常的东西。

2 个答案:

答案 0 :(得分:0)

如果您的所有数据都在同一个表中,则可以在同一个Select语句中执行所有这些过滤器。像

这样的东西
SELECT AVG(Grades) As Average, StudentID,StudentName, Count(StudentCourses) As "Courses" FROM Students Where Average >= 80 AND Courses >= 8;

否则您需要进行一两次加入。我必须看到你的表格给出更好的答案。

答案 1 :(得分:0)

我进入Doctrine's ArrayCollection来执行这类任务。但你也可以用好旧的array_filter来做到这一点。

我们假设您将未过滤的结果存储在数组$all_students

$all_students = $connection
                    ->query("select * from students")
                    ->fetchAll(\PDO::FETCH_ASSOC);

使用array_filter

$over_80_avg = array_filter($all_students, function($student, $index) {
    return $student['avg'] >= 80;
}, ARRAY_FILTER_USE_BOTH));

$less_8_courses = array_filter($over_80_avg, function($student, $index) {
    return $student['courses_count'] <= 8;
}, ARRAY_FILTER_USE_BOTH));

使用Doctrine ArrayCollection

进入学说可能有点过分(这可能意味着如果你没有进入作曲家)只是为了执行这个,但它最终会为自己付出代价。

从原始数组中实例化ArrayCollection:

$all_students_collection= new Doctrine\Common\Collections\ArrayCollection($all_students);

(请注意我使用完全限定的命名空间,因为我对您的代码一无所知)

ArrayCollections允许您执行如下过滤器:

$over_80_avg_collection = $all_students_collection->filter(function($student) {
    return $student->avg >= 80;
});

然后,您声明的每个新变量都可以是前者或主要变量的子过滤器:

$less_8_courses_collection = $over_80_avg_collection->filter(function($student) {
    return $student->courses_count <= 8;
});

最后,您需要将这些集合转换回数组以满足您的初衷:

$over_80_avg = $over_80_avg_collection->toArray();
$less_8_courses = $less_8_courses_collection->toArray();

另一种方式是直接进入一个只是为了向数组添加糖语法的库,例如Underscore.php

无论哪种方式,您都需要将原始数组视为不可变,因此无论如何都要避免使用任何将数组作为引用传递的方法,因为它也会从原始数组中删除行。