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个学生的分数,如果学生没有大学,但其他大学有剩余的地方,但不在学生选拔名单上。