2016-10-07 45 views
1

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

如果我第一次选择获得每个独特的学生姓名,那么我可以对平均值超过80的结果进行排序。这不是问题,但我想放弃那些不符合此标准的问题,然后为那些课程少于8门的学生做另一项选择,然后放弃。然后进入最终名单,并放弃任何没有80英语的学生。

我可以做每个作为一个单独的选择语句,但我想存储每个结果,并在下一步中使用它。最后,我想最后列出的学生有80个平均水平,8门课程,最低80英语...

我知道这是可能的(如果不是这将是疯狂的),但是什么是这样做的最好和最有效的方法,六月分数将是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分的标记,所以在计算时必须将其转换为正常值。

+0

这样的声音可以在单个查询中完成。你能否提供你的餐桌结构,以便我们能够合作? – Mureinik

回答

0

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

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

否则,您将需要执行一两个连接。我不得不看你的桌子给出更好的答案。

+0

数据在两张表格中,但我可以很容易地对它们进行连接。没有意识到你可以在同一个select语句中做AVG(成绩)和count(studentcourses),这可能会得到我需要的。感谢您的帮助,这非常合理。 – Vincent

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)); 

教义的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。无论采用哪种方式,您都需要将原始数组视为一个无法修改的数组,因此通过任何方式避免任何传递数组作为参考的方法,因为它也会从原始数组中删除行。