2016-10-07 54 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。無論採用哪種方式,您都需要將原始數組視爲一個無法修改的數組,因此通過任何方式避免任何傳遞數組作爲參考的方法,因爲它也會從原始數組中刪除行。