获取与输入数据难以连接的数据,SQL Query

时间:2014-01-23 21:02:44

标签: mysql sql

首先,想问你(所以我的问题会更清楚)如果有一个在线数据库图表工具(?),我可以在其中输入我的sql代码,它将绘制diagramm (有表和他们的关系)对我来说。

我找到this question并尝试了一些工具,但大多数工具只能在它们之间创建表和关系,但不允许导入我的sql。

(2) 我需要让所有课程与教师联系。 有两种类型的连接:老师可能是形式大师或老师可能是这个类。 如何获得与老师相关的所有课程。

(3)另外还有一个问题:我是否适合约束?

SQL Scheme(scheme on sqlfiddle.com):

CREATE TABLE `Subject` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
);

CREATE TABLE `Teacher` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `firstname` VARCHAR(50) NOT NULL,
    `midname` VARCHAR(50) NOT NULL,
    `lastname` VARCHAR(50) NOT NULL,
    `address` VARCHAR(100) NOT NULL,
    `birthdate` DATE NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `Class` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `digit` INT(11) NOT NULL,
    `char` VARCHAR(50) NOT NULL,
    `teacher_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_Class_Teacher` (`teacher_id`),
    CONSTRAINT `FK_Class_Teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`)
);

CREATE TABLE `ClassVsSubject` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `subject_id` INT(11) NOT NULL,
    `class_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `subject_id_class_id` (`subject_id`, `class_id`),
    INDEX `FK_ClassVsSubject_Class` (`class_id`),
    CONSTRAINT `FK_ClassVsSubject_Class` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`),
    CONSTRAINT `FK_ClassVsSubject_Subject` FOREIGN KEY (`subject_id`) REFERENCES `subject` (`id`)
);
CREATE TABLE `TeacherVsSubject` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `teacher_id` INT(11) NOT NULL,
    `subject_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_TeacherVsSubject_Teacher` (`teacher_id`),
    INDEX `FK_TeacherVsSubject_Subject` (`subject_id`),
    CONSTRAINT `FK_TeacherVsSubject_Teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`),
    CONSTRAINT `FK_TeacherVsSubject_Subject` FOREIGN KEY (`subject_id`) REFERENCES `subject` (`id`)
);

2 个答案:

答案 0 :(得分:1)

对于第二个问题,请使用以下内容:

select *
  from Class
 where teacher_id = 1

union

select Class.*
  from Class
       join ClassVsSubject on Class.id = ClassVsSubject.class_id
       join TeacherVsSubject on ClassVsSubject.subject_id = TeacherVsSubject.subject_id
 where TeacherVsSubject.teacher_id = 1

由于你没有说明哪个教师是起点,我使用id为1。

请注意,union删除了重复的条目,无需单独处理。

对于你的数据模型(问题3),我认为你需要在subject表中针对不同的类和相同的主题(如“数学”或“英语”)需要不同的条目,否则,联接不管用: 让我们说主题“英语”有id 1.现在,如果id为1的类和id为2的类都有这个主题,那么你将在ClassVsSubject中得到以下数据:

class_id   subject_id
       1            1
       2            1

你想如何进入表TeacherVsSubject,id为5的老师在1级教英语,而不是在2级?你不能!如果您输入subject_id 1和teacher_id 5的记录,这将适用于所有类。

要解决此问题,您可以从两个ClassVsSubjectTeacherVsSubject制作一个表格。这将是这样的:

CREATE TABLE `ClassVsSubjectVsTeacher` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `subject_id` INT(11) NOT NULL,
    `class_id` INT(11) NOT NULL,
    `teacher_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `subject_id_class_id` (`subject_id`, `class_id`, `teacher_id`),
    INDEX `FK_ClassVsSubjectVsTeacher_Class` (`class_id`),
    INDEX `FK_ClassVsSubjectVsTeacher_Teacher` (`teacher_id`),
    INDEX `FK_ClassVsSubjectVsTeacher_Subject` (`subject_id`),
    CONSTRAINT `FK_ClassVsSubjectVsTeacher_Class` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`),
    CONSTRAINT `FK_ClassVsSubjectVsTeacher_Teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`),
    CONSTRAINT `FK_ClassVsSubjectVsTeacher_Subject` FOREIGN KEY (`subject_id`) REFERENCES `subject` (`id`)
);

对于数据模型,此处不需要id列,主键可以是所有三个外键的组合键。但是 - 取决于客户端软件 - 拥有它可能很有用。 E. g。一些OR映射工具需要单列主键。

答案 1 :(得分:0)

试试这个:select * from Class where teacher_id = some_id_from_Teacher_table