Sql 根据学生成绩分配学生到大学
我知道我可能会被这个问题迷住,可能会被贴上离题的标签,但我迫切需要帮助 我需要建立一个系统,根据学生的分数将他们分配到大学。我需要知道使用哪种算法。我不擅长算法 我有以下表格: 学院:Sql 根据学生成绩分配学生到大学,sql,algorithm,Sql,Algorithm,我知道我可能会被这个问题迷住,可能会被贴上离题的标签,但我迫切需要帮助 我需要建立一个系统,根据学生的分数将他们分配到大学。我需要知道使用哪种算法。我不擅长算法 我有以下表格: 学院: id | name | capacity -------------------- 1 | C1 | 50 2 | C2 | 30 id | name | capacity | remained | --------------------------------- 1 | C1 | 50
id | name | capacity
--------------------
1 | C1 | 50
2 | C2 | 30
id | name | capacity | remained |
---------------------------------
1 | C1 | 50 | 50 |
2 | C2 | 30 | 30 |
学生:
id | name | degree | status
----------------------------
1 | S1 | 90 | 0
2 | S2 | 77 | 0
id | name | degree | college_id
-------------------------------
1 | S1 | 90 | null
2 | S2 | 77 | null
学生选择:
student_id | college_id | choice_order
---------------------------------------
1 | 10 | 1
1 | 3 | 2
student_id | college_id | choice_order
---------------------------------------
1 | 10 | 1
1 | 3 | 2
所以基本上我需要的是根据学生的选择顺序,分数,当然还有大学能力,把他们分配到正确的大学。因此,我们首先选择了排名前50位的学生,他们的选择顺序是1,然后被分配到第一所大学。那些没有成功的人,应该被分配到他们的第二选择,等等
对于学院1,我的基本问题如下:
SELECT * FROM student
INNER JOIN student_selection ON student.id = student_selection.student_id
WHERE college_id = 1 AND choice_order = 1 AND status = 0
Limit 50;
这些被选中的学生将被分配到学院1,并从算法中删除:
更新学生集状态=1,其中
但我知道这是行不通的,因为我需要某种递归算法,当一个学生因为分数低而无法按顺序1进入大学时,我们需要检查他的第二选择,等等
任何线索或提示都将不胜感激
我需要某种递归算法
不是递归的,你需要简单的循环。正如你正在谈论的算法,不说一些关于编程语言,我展示一些伪代码,它可以是Delphi,C++,C.。还有PSQL,T-SQL。。
但为了简化,我更改了您的表定义
此外,这并不是完全回答一些伪代码的方向-因为stackoverflow不是为您编写代码,只是为您解决问题
学院:
id | name | capacity
--------------------
1 | C1 | 50
2 | C2 | 30
id | name | capacity | remained |
---------------------------------
1 | C1 | 50 | 50 |
2 | C2 | 30 | 30 |
学生:
id | name | degree | status
----------------------------
1 | S1 | 90 | 0
2 | S2 | 77 | 0
id | name | degree | college_id
-------------------------------
1 | S1 | 90 | null
2 | S2 | 77 | null
学生选择:
student_id | college_id | choice_order
---------------------------------------
1 | 10 | 1
1 | 3 | 2
student_id | college_id | choice_order
---------------------------------------
1 | 10 | 1
1 | 3 | 2
_
评论后更新
你的评论会改变事情,因为优先级是等级和选择
SELECT * FROM student ORDER BY GRADE
while not student.eof do
begin
select TOP 1 * from student_selection S INNER JOIN College C on S.college_id = C.ID WHERE student_selection.student_id= :student.id AND C.remained>0 ORDER BY choice_order
if ABOVE_SELECT_RECORD_COUNT>0 then
begin
UPDATE student SET college_id = :College.id WHERE student.id= :student.id;
UPDATE College SET remained = remained - 1 WHERE college_id = :student_selection.college_id;
end
student.next;
end
正如我所说的那样
如果你有2个同年级的学生,你也需要考虑做什么,如果学生没有上过大学,如果其他学院有剩余的地方,但你的问题重点清单:<P>。 因此,我们首先选择了排名前50位的学生,他们的选择顺序是1,然后被分配到第一所大学 从你对利维乌斯回答的评论中,再次强调我的观点: 如果学生1最终没有被选择1录取,他需要为选择2竞争,如果学生1的分数高于学生3,选择2可能会拒绝已经被录取的学生3 我认为你把事情弄得不必要的复杂。如果一个学生的成绩超过了另一个学生的偏好,那么在你的算法中跟进。不要从第一所大学开始,而是从评分最高的学生开始。通过在分配评分较低的学生之前决定学生的作业,您以后将永远不必取消分配学生 我将提出以下算法: 获得前1名学生,即尚未分配的最高分数。 按此学生的偏好排序时,如果剩余容量>0,则获取排名前1的学院。 把学生分配到学院。 减少学院的剩余容量。 从步骤1开始重复,直到每个人都已分配,或所有容量都已消耗。
我希望这有帮助。如果我错过了任何需要更复杂方法的重要要求,请告诉我。在你的方法中,你可能会让E学生填满大学一年级,而没有给第二选择大学一年级的学生留下座位。我会按年级降序排列学生名单,确保每个人在进入下一个之前都有座位。这就是为什么我需要一些递归选项,它可以重新处理整个过程,确保每个人都有公平的机会。谢谢你的回答,我对psudo代码非常满意。我会考虑你的逻辑,尽管这还不够。如果学生1最终不接受选择1,他需要为他的选择2竞争,这可能最终拒绝一个已经接受的学生3,如果学生1有更好的马克比学生3。如果你需要考虑成绩,那么方法应该是不同的。不要只让学生按年级顺序通过大学。你还需要考虑如果你有2个学生的分数,如果学生没有大学,但其他大学有剩余的地方,但不在学生选拔名单上。