MySQL根据同一个表中的数据更新每条记录

时间:2012-09-30 22:50:44

标签: mysql sql-update

我在MySQL数据库中有一个表(只是示例)

CREATE  TABLE test.Names (
    id INT NOT NULL ,  
    salary INT NULL ,  
    name VARCHAR(45) NULL , 
    tmpl INT,
    PRIMARY KEY (`id`) ,  
    UNIQUE INDEX `id_UNIQUE` (`id` ASC)
);

我有这些记录

id,   salary, name, tmpl
1,    10,     John, null 
2,    20,     Pat,  null 
3,    30,     Jane, null

我想通过每个人的简单计算来更新表格

salary of each person/Sum(salary)*100

所以结果应该是

id,   salary, name, tmpl
1,    10,     John, 16.67 
2,    20,     Pat,  33.33 
3,    30,     Jane, 50

如何通过一个SQL查询执行此操作?或者什么是最好的方法(我假设真实的表将有> 100 000行)

3 个答案:

答案 0 :(得分:2)

使用单独的SELECT语句获取总薪水 - 将其放入变量中,或者将其与现有表交叉连接。然后,您可以获得每条记录的总和。

此SQL代码足以:

SET @sum_salaries = (SELECT SUM(salary) FROM test.Names);

UPDATE test.Names
SET tmpl = salary/@sum_salaries * 100;

甚至不需要加入。这种方式更简单,可能更快。

答案 1 :(得分:1)

试试这个:

SET @SallarySum = (SELECT SUM(salary) FROM TableName);

UPDATE Names t1
INNER JOIN
(
    SELECT id, (Salary / @SallarySum) * 100 tmpl
    FROM Names
) t2 ON t1.Id = t2.Id
SET t1.tmpl = t2.tmpl;

这是SQL Fiddle DEMO

答案 2 :(得分:0)

试试这个:

update `test`.`Names`
 set tmpl = salary / (select sum(salary) from `test`.`Names`) * 100
where tmpl is null --for multiple times execution

您可能必须将tmpl列更改为double数据类型。