我正在使用MySQL开发学校的小型数据库。 我有一张教授用的桌子,带有ID,名称和电子邮件,还有一张演讲用的桌子,带有ID,演讲名称和该班的版本。然后,我有一个教授和讲座的中间表。
在下面您可以看到,我的上一张表包括一列用于评估的列。在哪里,每一次讲座教授都会得到一个分数。
<div id="tree"></div>
现在,我希望对教授讲授的所有课程进行平均评估。我用select创建了一个表。
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));
该表有效,但是有问题,它显示的唯一值是在创建表Avg_evaluation之前,父表(lecture_professor)中已经存在的值。而且,如果我想添加新教授和新版本,表格不会自动更新。
我该如何解决?我还认为我可以进行可更新的视图,但是不能使用AVG之类的算术函数。
我想在将所有新值插入演讲者教授表之后执行一个触发器。但我不知道如何。
谢谢您的帮助!
编辑:这是一些虚拟值。和更正。
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;
答案 0 :(得分:0)
您需要的是插入trigger之后,您可以在下面找到语法
CREATE TRIGGER trigger_name
AFTER INSERT
ON table_name FOR EACH ROW
BEGIN
-- variable declarations
-- trigger code
END;
示例:-
CREATE TRIGGER new_loaner_added
AFTER INSERT ON total_loaner
FOR EACH ROW
INSERT INTO available_loaner (Kind, Type, Sno, Status)
VALUES (NEW.Kind, NEW.Type, NEW.Sno, 'Available');
答案 1 :(得分:0)
这是您的数据视图
drop table if exists lecture_professor;
drop table if exists lecture,professor;
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_professor (
professor_id INT,
lecture_id INT,
Evaluation INT ,
FOREIGN KEY fk1 (professor_id) REFERENCES professor (professor_id),
FOREIGN KEY fk2 (lecture_id) REFERENCES lecture (lecture_id)
);
insert into professor 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);
drop view if exists v;
create view v as
SELECT p.professor_id,p.professor_name,
coalesce(AVG(Evaluation),0) AS Avg_Eval
FROM professor p
left join lecture_professor lp on p.professor_id = lp.professor_id
GROUP BY professor_id,p.professor_name
;
select * from v;
我不知道为什么您不认为视图不能包含聚合函数,因为输出对我来说很好
+--------------+----------------+----------+
| professor_id | professor_name | Avg_Eval |
+--------------+----------------+----------+
| 1 | Ana | 2.5000 |
| 2 | Peter | 3.3333 |
| 3 | Mitchel | 3.0000 |
+--------------+----------------+----------+
3 rows in set (0.00 sec)
请注意显式联接。