向特定房间添加新主题时,您可以做的是:
- 获取该房间中所有不同学生的列表。
- 获取每个学生所有科目的列表。
- 如果学生没有最近添加的科目,请添加。
尽管就数据结构而言,您的数据库并没有真正受益于实体和关系。
从您所展示的内容来看,我想您是数据库主题的新手。简单来说,我会做以下事情。
-
Rooms 表,您可以在其中存储所有不同的房间。
-
Subjects 表,您可以在其中存储所有不同的主题。
- 一个Students表,您可以在其中存储所有特定的学生数据。
- 一个关系表SubjectsPerRoom,您可以在其中将主题连接到房间。这样您就可以轻松定义哪个房间有哪些主题。
- 一个关系表SubjectsPerStudentPerRoom,您基本上可以在其中建立三个实体之间的连接。如果您有 SubjectsPerRoom 表,这有点多余,但是当特定学生可以拥有或没有特定主题时,您可以将其用于例外情况。
图表示例如下所示:
例如,如果您想添加一个新的主题,您必须执行类似的操作。
INSERT INTO `Rooms` (room_name) VALUES ('rose');
假设这返回 ID=1
INSERT INTO `Subjects` (subject_name) VALUES ('music');
假设这返回 ID=34。然后你把它分配给房间 1
INSERT INTO `SubjectsPerRoom` (subject_id, room_id) VALUES (34, 1);
现在您知道主题 music 已分配到房间 rose。如果您稍后添加另一个房间或另一个主题,您可以使用相同的查询并创建这些实体之间的关系。这样,每个房间只有一个实例,并且不会重复信息,而只是将事物相互关联。正如对您的问题所评论的那样,这是数据的标准化。
那么,假设您添加了 3 个学生:
INSERT INTO `Students` (student_name) VALUES ('Tom');
INSERT INTO `Students` (student_name) VALUES ('Jerry');
INSERT INTO `Students` (student_name) VALUES ('Butch');
假设它们返回 ID 1、2 和 3。
现在,您有 1 个房间、1 个科目和 3 个学生。剩下的就是在student、room和subject之间建立关系。
INSERT INTO SubjectsPerStudentPerRoom (student_id, subject_id, room_id) VALUES (1, 34, 1);
INSERT INTO SubjectsPerStudentPerRoom (student_id, subject_id, room_id) VALUES (2, 34, 1);
INSERT INTO SubjectsPerStudentPerRoom (student_id, subject_id, room_id) VALUES (3, 34, 1);
现在您知道有三个学生被分配到房间 rose 学习音乐。
然后,如果您添加,让我们按照您的要求说一个新主题。您将执行以下步骤:
- 创建主题。
- 将其分配给房间。
- 选择分配到房间 rose 的所有学生。
- 对于分配到房间 rose 的每个现有学生,添加与新学科的新关系。
INSERT INTO `Subjects` (subject_name) VALUES ('english');
假设返回 35
INSERT INTO `SubjectsPerRoom` (subject_id, room_id) VALUES (35, 1);
由于您尚未将新学生添加到该房间,并且您只是创建了主题并将其分配给该房间,因此您只需要创建房间之间的关系。
$query = 'SELECT * FROM SubjectsPerStudentPerRoom WHERE `room_id` = 1';
// run your query and let's say the info is assigned to $students
foreach($students as $student) {
$query = 'INSERT INTO SubjectsPerStudentPerRoom (student_id, subject_id, room_id) VALUES ($student->student_id, 35, 1);';
}
然后,如果您想选择分配到特定房间中特定班级的学生,您可以这样做:
SELECT * FROM SubjectsPerStudentPerRoom
JOIN Students ON Students.student_id = SubjectsPerStudentPerRoom.student_id
WHERE SubjectsPerStudentPerRoom.room_id = 1 AND SubjectsPerStudentPerRoom.subject_id = 35
这将为您分配到房间 rose 和科目 english 的所有学生。
希望这可以帮助您实现所需的目标。
PS:这是故意简化的,但它应该会引导您朝着正确的方向前进。