mysql使用单个sql更新多个表以获得总和(qty)

时间:2013-08-26 11:30:19

标签: mysql

我有两个数据表

CREATE TABLE `MASTER` (
  `NAME` VARCHAR(10)      NOT NULL,
  `QTY`  INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`NAME`)
);
NAME  | QTY
----------
'ABC' | 0
'XYZ' | 0
CREATE TABLE `DETAIL` (
  `NAME` VARCHAR(10)         NOT NULL,
  `QTY`  INT(10) UNSIGNED    NOT NULL,
  `FLAG` TINYINT(1) UNSIGNED NOT NULL
);
NAME  | QTY| FLAG
--------------------
'ABC' | 10 | 0
'ABC' | 20 | 0
'PQR' | 15 | 0
'PQR' | 25 | 0

我想将sum(detail.qty)更新为master并将其标志设置为1 所以我写了查询

UPDATE MASTER M, DETAIL D
SET M.QTY = M.QTY + D.QTY,
  D.FLAG =1
WHERE M.NAME = D.NAME;

我猜测MASTER.QTY应该是详细信息表中的30(10 + 20)。 但它只更新第一个值 实际值是MASTER.QTY = 10(仅从表中更新第一个值)

我怎样才能获得MASTER.QTY = 30?

2 个答案:

答案 0 :(得分:0)

IMO,您的主表是不必要的。如果>中的行数不足,则您不需要它。 5位数范围。

这等于MASTER表:

SELECT NAME, SUM(QTY), FLAG FROM DETAIL GROUP BY NAME;

您可以轻松地创建视图。

你的回答无论如何:

UPDATE MASTER m
JOIN DETAIL d ON m.NAME = d.NAME
SET
  d.FLAG = 1,
  m.QTY = (SELECT SUM(QTY) FROM DETAIL WHERE NAME = d.NAME GROUP BY NAME)
WHERE m.NAME = d.NAME

此外,请始终遵循规范化规则:https://en.wikipedia.org/wiki/Database_normalization

答案 1 :(得分:0)

尝试此查询:

update `MASTER` m,`DETAIL` d,
(
   SELECT `NAME`, SUM( `QTY` ) as `QTY`
   FROM `DETAIL`
   GROUP BY `NAME`
) s
SET m.QTY = s.QTY,
    d.FLAG = 1
WHERE
    m.NAME = s.NAME
    AND m.NAME = d.NAME
;

SQLFiddle演示 - > http://www.sqlfiddle.com/#!2/ab355/1