【问题标题】:i have three columns, i want to combine them all in one main_table我有三列,我想将它们全部合并到一个 main_table
【发布时间】:2018-09-12 07:32:22
【问题描述】:

我在 mysql 中工作,我知道表关系“加入”等, 我有三个不同的表,每个表都有列 id,我想将所有三个 id 组合到一个主表中,因为我想在一张表中获取所有 id 后应用内连接。 你能告诉我如何在一个表中获取所有三个 id,我知道外键和主键,但我不知道如何在这里应用它......或者有什么简单的方法可以做到这一点。 我的表名:

Table 1 contains: student_id coloumn
Table 2 contains: teachers_id
Table 3 contains: class_id

主表是table 4:将有student_id,teachers_id,class_id coloumn

我正在尝试生成时间表,我想在主表 time_table 中获取学生 ID、教师 ID 和班级 ID;我正在尝试进行规范化,这样我就不必一次又一次地重复所有名称,我可以使用 id 来调用任何班级名称教师名称主题名称等,所有 id 都是表中的主键。

在这种情况下,关系是一对一的


我正在研究 php_mysql。

谢谢

【问题讨论】:

  • 显示示例数据、预期结果以及您尝试过的内容
  • 表之间的关系是什么?外键是否已经存在?请提供更多详细信息
  • 如果你想组合这三个表,它们需要相互关联。否则,您将获得一个巨大的表,其中一个表的所有 ID 对应所有其他表的所有 ID。
  • 在这种情况下,您需要学生与班级之间的关系

标签: php mysql sql mysqli


【解决方案1】:

如下创建表,

 create table subject(subject_id int primary key,sub_name varchar(20))
 create table teacher(teacher_id int primary key,teacher_name varchar(20))
 create table class(class_id int primary key,class_sec varchar(20))

 create table timetable(t_id int primary key,subject_id int references 
 subject(subject_id)
 ,teacher_id int references teacher(teacher_id),class_id int references 
 class(class_id))

插入样本值

 insert into subject values(1,'Tamil')
 insert into teacher values(1,'Pugal')
 insert into class values(1,'12th A')
 insert into timetable values(1,1,1,1)

使用Inner join连接表,

 select s.sub_name,t.teacher_name,c.class_sec from timetable t1 
 inner join subject s
 on s.subject_id = t1.subject_id inner join teacher t
 on t.teacher_id = t1.teacher_id inner join class c
 on c.class_id   = t1.class_id

试试这个......如果需要任何澄清,请回复我......

【讨论】:

  • 是的,方向正确,谢谢,正如你提到的那样; 插入时间表值(1,1,1,1)我希望自动从每个表中提取这些值(1,1,1),因为如果我有 1000 条记录,我无法复制三千条记录三个表中的值以在时间表中调用它们。
  • 为此,您只需使用触发概念。触发器根据您对自动插入值的期望提供结果。
  • 我相信这将是一个使用外键的简单查询。
【解决方案2】:
SELECT Teachers.teacher_name, Class.class_sec, Subjects.subject_name FROM timetable
INNER JOIN Teachers ON Teachers.teacher_id = timetable.teacher_id
INNER JOIN Class ON Class.class_id = timetable.class_id
INNER JOIN Subjects ON Subjects.subject_id = timetable.subject_id

【讨论】:

  • 因为我只想获取id,所以我修改了你的代码; SELECT Teachers.teacher_id FROM Teachers INNER JOIN Teachers ON Teachers.teacher_id = timetable.teacher_id; SELECT class.class_id FROM class INNER JOIN class ON class.class_id = timetable.class_id;从subjects.subject_id 中选择subjects.subject_id 在subjects.subject_id = timetable.subject_id 上选择subjects.subject_id -------- 错误:#1066 - 不是唯一的表/别名:'class'
  • 我不太明白你想做什么。您可以将第一行编辑为:SELECT Teachers.teacher_id, Class.class_id, Subjects.subject_id FROM timetable
  • 但结果会像 SELECT * FROM timetable
【解决方案3】:

据我所知,如果我错了,请纠正我, 一个班有一个老师,化简了,一个老师教一个班或多个班(更复杂的情况是每个班不止一个老师): 关系是一对多,所以 class 表应该包含一个teacher_id

一个学生可以上多个班级,但是一个班级有很多学生,那么关系是多对多的, 应该创建一个新表 class_per_student

当然,我们需要用相关信息填充它们,

完成后,我们可以连接所有相关表格并获取时间表

添加teacher_id 列:

ALTER TABLE class ADD COLUMN teacher_id INT(9) NOT NULL;
ALTER TABLE class ADD KEY teacher_id (teacher_id);

创建多对多表

CREATE TABLE class_per_student (
 id INT(11) NOT NULL AUTO_INCREMENT,
 class_id INT(9) NOT NULL,
 student_id INT(9) NOT NULL,
 PRIMARY KEY id (id),
 KEY class_id (class_id),
 KEY student_id (student_id)
);

时间表选择:

SELECT
 cps.class_id,
 cps.student_id,
 c.teacher_id
FROM
 class_per_student cps
 INNER JOIN class c ON c.id = cps.class_d
;

请注意,由于所有实体之间的关系是多对多的,因此它们中的每一个(班级、教师、学生)都会出现不止一次,但 3 的唯一组合会出现一次

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多