Re: [請益] 推甄選填系統
1. 所有學生都集中在一個資料表就好. 因為以'班級'做'分群'是可以在有必要
時再透過SQL查詢得到的. 但若一開始就依班級分資料表存放學生記錄的的話
, 等於一開始就寫死了, 不管是後續的要維護資料的完整性或是要做合併查
詢都相當麻煩.照理說, 這種依班級分資料表的想法根本就不該列入考慮.
2. 可以寫程式列舉所有校系, 並針對每一個校系所關聯到的學生志願的分數由高
而低予以排序. 再限定前三筆記錄即可.
這樣的需求可以透過四個表的關聯設計(已將正規化考慮進去)來達到:
1.學生, 2.班級, 3.校系, 以及4.志願(學生選校系的記錄):
學生: id, 學號(帳號), 密碼, 姓名, class_id(所屬班級的外鍵)
班級: id, 班級, 所屬組別(甲組/乙組/丙組)
校系: id, 學校, 系名, 最低錄取分數, 名額
志願: id(可有可無), user_id, target_id(所選校系的外鍵),
志願順序, 推薦分數, 是否錄取
1個學生只能屬於1個班級; 1個班級可以包括 n 個學生;
1個學生可以填寫 n 筆志願; 1個校系可以包含 n 筆志願;
1筆志願只能同時屬於1個學生及1個校系.
四個表之間的關聯如下:
+-n-1->學生-n-1->班級
志願--+
+-n-1->校系
如何查詢一個校系當中所錄取志願之最高分數的前三名學生?
以php+MySQL為例:
function top3list($target_id){
$link=mysqlConn(); //mysqlConn()是客製函式, 把例行資料庫連線作業做掉;
$sql="
select 學生.*
from 志願
left join 學生 on 志願.user_id=學生.id
where 志願.target_id=$target_id
order by 志願.推薦分數 desc
limit 0,3;
";
$top3=array();
$rs=mysql_query($sql,$link);
while($r=mysql_fetch_assoc($rs))
$top3[]=$r;
return $top3;
}
在寫程式時, 可以把上述已包成一個函式的SQL重複使用. 若要
針對所有校系做同樣的事情, 只要再寫另一個SQL列舉所有的校
系的id, 然後再一個個丟進去上述的SQL函式查詢即可.
$link=mysqlConn();
$sql="
select id from 校系 order by 你要的排序條件;
";
$rs=mysql_query($sql,$link);
$all_target=array();
while($r=mysql_fetch_assoc($rs))
$all_target[$r['id']]=top3list($r['id']);
//以上. all_target即是所得. 至於在視覺上如何將資料予以報表
形式呈現那又是另一道工序了.
對於各種不同需求的查詢, 都可以仿照上述的樣板下去套.
上述程式碼主要是示意用, 僅供參考. 實際上並不能run. XD
※ 引述《Parati (好。難。過)》之銘言:
: 想請問一下版上的高手
: 如果想設計一個像http://ce.pymhs.tyc.edu.tw/的志願選填系統
: 不知各位的MySQL資料表欄位會如何設計
: 如果設一個Class1的資料表來儲存使用者選填資訊 欄位如下
: ========== ==== ====== ======== ====== ======== ====== =======
: 使用者帳號 密碼 志願一 推薦分數 志願二 推薦分數 志願三 推薦分數
: 有好幾個班的話 那資料庫是分成Class1、Class2等資料表還是都寫在同一個沒關係
: 會這樣問是原因是當要查詢結果的時候 如以下網址
: http://ce.pymhs.tyc.edu.tw/class.show_recommendation_list.php
: 要怎麼找出同一校系分數最高的前三個名額?
: 校系那麼多 不可能每一行不同的校系都寫query吧 = =
: 想請教一下版上的高手的問題~
: 問題1.依照各位高手的經驗,規劃資料庫時是一班設一個資料表(日後管理較一目了然)
: 還是所有班級的學生都集中在一個資料表就好了
: 還是說都沒差
: (想說先規劃好對之後查詢比較的功能會比較好寫)
: 問題2.就是那個查詢功能要怎麼找出同一校系分數最高的前三個名額?
: (如果是存成一班一個資料表等 那麼多資料表要抓出來比較~PHP要怎麼寫呀?)
: 以前只是玩小小的留言板
: 第一次嘗試看看那麼大的系統 所以有很多問題請教
: 原po只是沒經驗的新手 希望藉助版友的技術與經驗~非常感謝~
: 不好意思~把問題重新打的比較清楚一點
: 花費時間來看這篇 感激不盡
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.74.193.210
※ 編輯: bobju 來自: 211.74.193.210 (02/03 18:13)
※ 編輯: bobju 來自: 211.74.193.210 (02/03 18:21)
推
02/03 20:22, , 1F
02/03 20:22, 1F
→
02/03 20:23, , 2F
02/03 20:23, 2F
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章
0
18