Mysql 我应该如何修改触发器,以便根据其部门获得总员工数?

Mysql 我应该如何修改触发器,以便根据其部门获得总员工数?,mysql,database-trigger,Mysql,Database Trigger,下表列出 CREATE TABLE `departments` ( department_id INT(2) NOT NULL AUTO_INCREMENT, department_name VARCHAR(30) NOT NULL, total_employees INT(4), PRIMARY KEY (department_id), UNIQUE (department_name)); CREATE TABLE `employees` ( employee_id INT(4) NOT N

下表列出

CREATE TABLE `departments` (
department_id INT(2) NOT NULL AUTO_INCREMENT,
department_name VARCHAR(30) NOT NULL,
total_employees INT(4),
PRIMARY KEY (department_id),
UNIQUE (department_name));

CREATE TABLE `employees` (
employee_id INT(4) NOT NULL AUTO_INCREMENT,
employee_email VARCHAR(30) NOT NULL,
employee_first_name VARCHAR(30) NOT NULL,
employee_last_name VARCHAR(30) NOT NULL,
department_name VARCHAR(30) NOT NULL,
PRIMARY KEY (employee_id),
UNIQUE (employee_email),
FOREIGN KEY (department_name)
    REFERENCES departments (department_name)
    ON DELETE CASCADE);
这是触发器,我希望它显示每个部门的员工总数

delimiter $$
create trigger department_wise_total_employee_counting
after insert on employees 
for each row begin update departments set total_employees=total_employees+1
where department_id=department_id; end$$ delimiter ;

INSERT INTO `departments` 
VALUES 
(1,'HRM',0),(2,'Accounting',0);
INSERT INTO `employees` 
VALUES 
(1,'bh@gmail.com','A','B','HRM'),
(2,'ak@gmail.com','C','D','HRM'),
(3,'mr@gmail.com','E','F','HRM'), 
(4,'pr@gmail.com','G','H','Accounting');
在运行以下查询时:

select * from departments;
我得到了这个输出,它只是给出了员工总数,而不是每个部门的总数。

我试图得到人力资源管理的员工总数=3,会计的员工总数=1。
非常感谢您的建议。

正如@p.Salmon所指出的,一般来说,您不应该存储您可以轻松计算的数据。对于这种应用,a(正如@TamilSelvanC所建议的)是一个很好的解决方案。例如:

CREATE VIEW departments_view AS
SELECT d.department_id, d.department_name, COUNT(e.employee_id) AS total_employees
FROM departments d
LEFT JOIN employees e ON e.department_name = d.department_name
GROUP BY d.department_id;
SELECT * FROM departments_view
输出:

department_id   department_name     total_employees
1               HRM                 3
2               Accounting          1
3               Engineering         0

正如@p.Salmon所指出的,一般来说,您不应该存储可以轻松计算的数据。对于这种应用,a(正如@TamilSelvanC所建议的)是一个很好的解决方案。例如:

CREATE VIEW departments_view AS
SELECT d.department_id, d.department_name, COUNT(e.employee_id) AS total_employees
FROM departments d
LEFT JOIN employees e ON e.department_name = d.department_name
GROUP BY d.department_id;
SELECT * FROM departments_view
输出:

department_id   department_name     total_employees
1               HRM                 3
2               Accounting          1
3               Engineering         0


使用mysql视图而不是trigger@TamilSelvanC如果你能展示一下你的想法,那就太好了。你不应该存储你可以轻松计算的东西——如果有人离开,你需要一个删除触发器,如果员工更换了部门,你需要一个更新触发器。在插入触发器中,我希望看到新的引用。values.where department\u id=department\u id可能应该是department\u id=NEW.department\u id使用mysql视图而不是trigger@TamilSelvanC如果你能展示一下你的想法,那就太好了。你不应该存储你可以轻松计算的东西——如果有人离开,你还需要一个删除触发器;如果员工变动,你还需要一个更新触发器在一个插入触发器中,我希望看到新的引用。values.where department\u id=department\u id应该是department\u id=NEW.department\u id感谢我一直在寻找的一系列精确的解决方案。脱帽致敬,别担心。很高兴我能帮上忙。但当一个部门的员工数为0时,它会给出默认值1。我怎样才能摆脱这个?非常感谢任何建议。@Bappi_SB对此表示抱歉-我在演示中没有考虑到这种可能性。我已经更新了查询和演示,以便在部门没有员工的情况下给出正确答案。非常感谢,先生。非常感谢,我一直在寻找的确切解决方案。脱帽致敬,别担心。很高兴我能帮上忙。但当一个部门的员工数为0时,它会给出默认值1。我怎样才能摆脱这个?非常感谢任何建议。@Bappi_SB对此表示抱歉-我在演示中没有考虑到这种可能性。我已经更新了查询和演示,以便在一个部门没有员工时给出正确的答案。谢谢,先生。