从另一个表更新总和

时间:2015-08-07 20:46:38

标签: php mysql

我在库存表中有物品移动 和报告表。

动作表:

------------------------------------
id   | part_number | amount | code |
------------------------------------
101  | 3-80-75     |  55    |  2
102  | 5-88-70M    |  -65   |  1
103  | 1-46-57     |  11    |  1
104  | 3-80-75     |  -8    |  2   
105  | 5-51-54     |  76    |  2
106  | 3-80-75     |  -22   |  1
107  | 5-51-54     |  62    |  1
108  | 1-46-57     |  -3    |  2
109  | 3-80-75     |  -16   |  2
-----------------------------------

报告表:

----------------------------------
id  | part_number  | total_code2  |
----------------------------------
456 |  3-80-75     |   
457 |  5-88-70M    |   
458 |  1-46-57     |   
459 |  3-80-75     |   
460 |  5-51-54     |   
----------------------------------

我需要使用代码2的总和来更新报表, 对于每个零件号。

结果必须是这样的:

----------------------------------
id  | part_number  | total_code2  |
----------------------------------
456 |  3-80-75     |   31
457 |  5-88-70M    |   0
458 |  1-46-57     |   -3
459 |  3-80-75     |   -24
460 |  5-51-54     |   76
----------------------------------

2 个答案:

答案 0 :(得分:3)

据我所知,您想要对具有code = 2的数字的代码求和。您可以使用一个SQL查询和内部联接来执行此操作:

UPDATE report r
JOIN
    (
        SELECT part_number, SUM(code) total_code
        FROM movements
        WHERE code = 2 
    ) m
ON m.part_number = r.part_number
SET total_code2 = m.total_code

答案 1 :(得分:1)

问题中显示的报告表有两行,至少有一部分

所以我在报告表中添加了一个代码列。

根据代码2仅更新3行。

在允许问题snafu,imho

之后匹配预期结果

DDL:

create table movements
(   id int not null,
    part_number varchar(40) not null,
    amount int not null,
    code int not null
);
-- truncate table movements;
insert movements (id,part_number,amount,code) values (101,'3-80-75',55,2);
insert movements (id,part_number,amount,code) values (102,'5-88-70M',-65,1);
insert movements (id,part_number,amount,code) values (103,'1-46-57',11,1);
insert movements (id,part_number,amount,code) values (104,'3-80-75',-8,2);   
insert movements (id,part_number,amount,code) values (105,'5-51-54',76,2);
insert movements (id,part_number,amount,code) values (106,'3-80-75',-22,1);
insert movements (id,part_number,amount,code) values (107,'5-51-54',62,1);
insert movements (id,part_number,amount,code) values (108,'1-46-57',-3,2);
insert movements (id,part_number,amount,code) values (109,'3-80-75',-16,2);

create table report
(   id int not null,
    part_number varchar(40) not null,
    code int not null,
    total_code2 int not null
);
-- truncate table report;
insert report (id,part_number,code,total_code2) values (456,'3-80-75',2,0);
insert report (id,part_number,code,total_code2) values (458,'1-46-57',2,0);
insert report (id,part_number,code,total_code2) values (460,'5-51-54',2,0);

更新:

UPDATE report r
JOIN
    (   SELECT part_number, SUM(amount) total_code
        FROM movements
        WHERE code = 2 
        group by part_number
    ) m
ON m.part_number = r.part_number
SET total_code2 = m.total_code
where r.code=2  --   <----- only update code 2

结果:

select * from report;

+-----+-------------+------+-------------+
| id  | part_number | code | total_code2 |
+-----+-------------+------+-------------+
| 456 | 3-80-75     |    2 |          31 |
| 458 | 1-46-57     |    2 |          -3 |
| 460 | 5-51-54     |    2 |          76 |
+-----+-------------+------+-------------+
3 rows in set (0.00 sec)