简体   繁体   English

使用mysql中的其他表列总和填充一行数据

[英]Fill data of one row using other table column sum in mysql

I have 3 tables我有 3 张桌子

employee:员工:

 +----+--------+----------+--------+-----------------+-----+
 | id | E_name | super_id | salary | bdate           | Dno | 
 +----+--------+----------+--------+-----------------+-----+
 | 1  | John   | 3        | 100000 | Fri Jan 01 1960 | 1   | 
 | 2  | Mary   | 3        | 100000 | Tue Dec 01 1964 | 3   | 
 | 3  | Bob    | null     | 100000 | Thu Feb 07 1974 | 3   | 
 | 4  | Tom    | 1        | 100000 | Tue Jan 17 1978 | 2   | 
 | 5  | Bill   | null     | 100000 | Thu Jan 17 1985 | 1   | 
 +----+--------+----------+--------+-----------------+-----+

department :部门

 +-----+--------------+
 | Dno | dname        | 
 +-----+--------------+
 | 1   | Payroll      | 
 | 2   | Tech support | 
 | 3   | Research     | 
 +-----+--------------+

deptsal:部门:

 +-----+-------------+
 | dno | totalsalary | 
 +-----+-------------+
 | 1   | 0           | 
 | 2   | 0           | 
 | 3   | 0           | 
 +-----+-------------+

the deptsal table contains the sum of department-wise salaries with dno . deptsal表包含dno的部门工资总和。 as foreign key referencing department table..作为外键引用部门表..

I have to write two procedures in MySQL我必须在MySQL中写两个程序

  1. I have to write a procedure that updates the total salary of the department, whose dno is passed in the parameter of the procedure in the deptsal table我必须编写一个更新部门总工资的程序,其dno是在deptsal表中程序的参数中传递的

I tried this我试过这个

DELIMITER $$
CREATE PROCEDURE `updateSalary` (IN dno INT)
BEGIN
    UPDATE deptsal
    SET totalsalary = (
                    SELECT SUM(employee.salary) 
                    FROM employee 
                    WHERE employee.dno = @dno 
                    GROUP BY employee.dno
                )
    where deptsal.dno = dno;
END$$
DELIMITER ;

but this doesn't seem to work但这似乎不起作用

  1. I also have to write a procdure which update the whole deptsal table我还必须编写一个更新整个部门表的程序

here is my create table queries这是我的创建表查询

CREATE TABLE department (
    Dno INT(6) PRIMARY KEY,
    dname VARCHAR(25)
);

CREATE TABLE employee (
    id INT(6) PRIMARY KEY,
    E_name VARCHAR(25),
    super_id INT(6), 
    salary INT(10),
    bdate DATE,
    Dno INT(6)  
);
ALTER TABLE employee
ADD FOREIGN KEY (Dno) REFERENCES department(Dno);

CREATE TABLE deptsal (
    dno INT(6) PRIMARY KEY,
    totalsalary INT(10)
);
ALTER TABLE deptsal
ADD FOREIGN KEY (Dno) REFERENCES department(Dno);

@dno and dno are two seprate thnings @dno 和 dno 是两个独立的东西

DELIMITER $$ 
CREATE PROCEDURE `updateSalary` (IN dno INT)
BEGIN
    UPDATE deptsal
    SET totalsalary = (
                    SELECT SUM(employee.salary) 
                    FROM employee 
                    WHERE employee.dno = dno 
                    GROUP BY employee.dno
                )
    where deptsal.dno = dno;
END$$
DELIMITER ;

END$$
DELIMITER ;

To update all you can modify your procedure, to update all when dno = -1要更新所有你可以修改你的程序,当 dno = -1 时更新所有

Or write a second procedure或者写第二个程序

DELIMITER $$ 
CREATE PROCEDURE `updateSalaryAll` ()
BEGIN
    DECLARE finished INTEGER DEFAULT 0;
    DECLARE _dno INTEGER DEFAULT -1;

    -- declare cursor for department number
    DEClARE curdno 
        CURSOR FOR 
            SELECT dno FROM deptsal;

    -- declare NOT FOUND handler
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;

    OPEN curdno;
    getdno: LOOP
        FETCH curdno INTO _dno;
        IF finished = 1 THEN 
            LEAVE getdno;
        END IF;
        UPDATE deptsal
        SET totalsalary = (
                        SELECT SUM(employee.salary) 
                        FROM employee 
                        WHERE employee.dno = _dno 
                        GROUP BY employee.dno
                    )
        where deptsal.dno = _dno;
    END LOOP getdno;
    CLOSE curdno;        
END$$
DELIMITER ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM