【问题标题】:how to recreate the data into user when the users already created当用户已经创建时如何将数据重新创建到用户中
【发布时间】:2021-07-12 10:25:48
【问题描述】:

你好,希望你能帮助我解决这个问题。我不知道当用户已经创建并且想要在老师创建另一个主题并将该主题添加到他们的日程表时循环所有用户 ID 时这是否可能......所以这是我将解释的问题

我创建了一个有年级、房间和科目的学生

输出

student_id | grade  | room | subject 
1          | 1st yr | rose | math
1          | 1st yr | rose | english

所以学生 1 在 1st yearrose 房间创建并拥有数学和英语科目。

如果老师想在第一年和玫瑰室创建或添加主题音乐学生怎么办。假设老师已经添加了这两个。所以期望输出是这样的

student_id | grade  | room | subject 
2          | 1st yr | rose | math
2          | 1st yr | rose | english
2          | 1st yr | rose | music

在创建一个学生并在该表上完成整体输出之后

student_id | grade  | room | subject 
1          | 1st yr | rose | math
1          | 1st yr | rose | english

2          | 1st yr | rose | math
2          | 1st yr | rose | english
2          | 1st yr | rose | music 

现在的问题是学生1没有音乐科目。 问题是如何在 student 1 上添加该主题 music if 已经被老师创建了。

【问题讨论】:

  • 如果这些表是数据库中的表,你一定要在规范化时阅读!

标签: php mysql loops while-loop


【解决方案1】:

向特定房间添加新主题时,您可以做的是:

  1. 获取该房间中所有不同学生的列表。
  2. 获取每个学生所有科目的列表。
  3. 如果学生没有最近添加的科目,请添加。

尽管就数据结构而言,您的数据库并没有真正受益于实体和关系。

从您所展示的内容来看,我想您是数据库主题的新手。简单来说,我会做以下事情。

  • 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 个学生。剩下的就是在studentroomsubject之间建立关系。

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 学习音乐

然后,如果您添加,让我们按照您的要求说一个新主题。您将执行以下步骤:

  1. 创建主题。
  2. 将其分配给房间。
  3. 选择分配到房间 rose 的所有学生。
  4. 对于分配到房间 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:这是故意简化的,但它应该会引导您朝着正确的方向前进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多