【发布时间】:2019-06-06 10:08:04
【问题描述】:
我正在开发一个学校的小型数据库,使用 MySQL。 我有一张教授表,上面有 id、姓名和电子邮件,还有一张讲座表,上面有 id、讲座名称和该课程的版本。然后,我有一个教授和讲座的中间表。
正如您在下面看到的,我的最后一个表格包含一个用于评估的列。其中,对于每堂课,教授都会获得一个分数。
CREATE TABLE professor (
professor_id INT PRIMARY KEY,
professor_name VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE);
CREATE TABLE lecture (
lecture_id INT PRIMARY KEY,
lecture_name VARCHAR(50) NOT NULL,
edition INT NOT NULL);
CREATE TABLE lecture_prof (
professor_id INT,
lecture_id INT,
Evaluation INT,
FOREIGN KEY (professor_id) REFERENCES professor (professor_id),
FOREIGN KEY (lecture_id) REFERENCES lecture (lecture_id));
现在,我想要教授教授的所有课程的平均评价。我用 select 创建了一个表。
CREATE TABLE Avg_Evaluation AS SELECT
p.professor_id,p.professor_name, AVG(Evaluation) AS Avg_Eval
FROM professor p, lecture_professor lp
WHERE p.professor_id=lp.professor_id
GROUP BY professor_id, professor_name;
该表可以工作,但有一个问题,它显示的唯一值是在创建表 Avg_evaluation 之前已经在父表 (lecture_professor) 中的值。如果我想添加新教授和新版本,表格不会自动更新。
我该如何解决这个问题?我还认为我可以做一个可更新的视图,但我不能使用像 AVG 这样的算术函数。
我想做一个触发器,因为在 Lecture_professor 表上插入任何新值之后。但我不知道怎么做。
感谢您的帮助!
编辑:这里有一些虚拟值。和更正。
INSERT INTO faculty
VALUES
(1,'Ana ','as@email.com'),
(2,'Peter','pt@email.com'),
(3,'Mitchel','mm@email.org');
INSERT INTO lecture VALUES (1, 'Econ', 20),(2, 'History', 1),(3, 'Social Studies', 2);
INSERT INTO lecture_professor VALUES (1,1,3),(2,1,2),(2,2,4),(2,3,4),(1,3,2),(3,1,3);
【问题讨论】:
-
一些代码批评 - 1) 与 group by 不同是没有意义的,因为 group by 将返回 1 行每个 p.professor_id,p.professor_name 2) Group by 应该包括两个选定的列 p.professor_id ,p.professor_name 3) 使用显式而不是隐式连接 4) 为可以计算的东西创建表通常不是一个好主意,在这种情况下,如果平均值可能会发生变化,可能会导致维护问题如果教授积累了更多的讲座。
-
@P.Salmon 谢谢你的建议,我会采纳的。但我不明白 3。另外,如果创建表不是最好的主意,我该如何解决我的问题?
-
好的,将一些示例数据作为文本添加到您的问题中。
-
@P.Salmon 我将一些示例值作为代码放置(这更容易,因为我目前正在测试一些选项)。谢谢!
标签: mysql select triggers insert-update