在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ 更新語(yǔ)句,涉及三個(gè)表,怎么寫(xiě)呢

更新語(yǔ)句,涉及三個(gè)表,怎么寫(xiě)呢

update stock_spec ss SET order_num=(
SELECT SUM(actual_num)
FROM sales_trade_order sto
LEFT JOIN sales_trade st ON sto.trade_id=st.trade_id
WHERE (st.trade_status=30 or st.trade_status=35) and sto.spec_id=ss.spec_id
)

上面是我寫(xiě)的,只是為了描述清楚問(wèn)題,不能在mysql中實(shí)現(xiàn)更新。
就是要更新stock_spec表中order_num為sales_trade_order中所有spec_id等于ss表中spec_id的actual_num的和同時(shí)要求sales_trade表的status等于30或35

回答
編輯回答
扯不斷

其實(shí)我也沒(méi)看懂,但我知道用SUM的話必定應(yīng)該用GROUP BY的。

2017年8月10日 10:10
編輯回答
夢(mèng)囈

把需要執(zhí)行的update語(yǔ)句分成每張表的update語(yǔ)句,然后放在事務(wù)里執(zhí)行,這樣應(yīng)該是最簡(jiǎn)單的方法了吧

2017年8月3日 06:32
編輯回答
拮據(jù)

最簡(jiǎn)單的是分三條一起執(zhí)行啊 加個(gè)begin end;就好了

2018年2月21日 03:27
編輯回答
女流氓

看了你的問(wèn)題,但不清楚你的業(yè)務(wù)表的具體表結(jié)構(gòu),把重要的字段提取出來(lái),作了個(gè)DEMO,不知道是不是你問(wèn)題里面想要的結(jié)果(溫馨提示一下:下次提問(wèn)的問(wèn)題還是把你的表結(jié)構(gòu)和測(cè)試用例寫(xiě)出來(lái)吧),以下是測(cè)試表結(jié)構(gòu)和數(shù)據(jù):

CREATE DATABASE `test`;

USE `test`;

DROP TABLE IF EXISTS `sales_trade`;

CREATE TABLE `sales_trade` (
  `id` int(11) DEFAULT NULL,
  `trade_id` varchar(16) DEFAULT NULL,
  `trade_status` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `sales_trade`(`id`,`trade_id`,`trade_status`) values 
(1,'order_num_001',30),
(2,'order_num_002',35);

DROP TABLE IF EXISTS `sales_trade_order`;

CREATE TABLE `sales_trade_order` (
  `id` int(11) DEFAULT NULL,
  `trade_id` varchar(16) DEFAULT NULL,
  `spec_id` int(11) DEFAULT NULL,
  `actual_num` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `sales_trade_order`(`id`,`trade_id`,`spec_id`,`actual_num`) values 
(1,'order_num_002',1,5),
(2,'order_num_003',3,10),
(3,'order_num_001',3,2);


DROP TABLE IF EXISTS `stock_spec`;

CREATE TABLE `stock_spec` (
  `id` int(11) DEFAULT NULL,
  `trade_id` varchar(16) DEFAULT NULL,
  `order_num` int(11) DEFAULT NULL,
  `spec_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


insert  into `stock_spec`(`id`,`trade_id`,`order_num`,`spec_id`) values 
(1,'order_num_001',0,1),
(2,'order_num_002',0,1),
(3,'order_num_003',0,3);

以下是更新操作:

UPDATE stock_spec AS ss 
INNER JOIN (
    SELECT sto.spec_id,SUM(actual_num) AS total_num 
    FROM sales_trade_order AS sto 
    LEFT JOIN sales_trade AS st ON sto.trade_id=st.trade_id
    WHERE (st.trade_status=30 OR st.trade_status=35)
    GROUP BY sto.spec_id
) AS t
SET ss.order_num=t.total_num 
WHERE ss.spec_id=t.spec_id

Before updated:

圖片描述

After updated:

圖片描述

2017年2月4日 05:33
編輯回答
影魅
update stock_spec ss SET order_num=(
    SELECT SUM(actual_num) FROM sales_trade_order sto where sto.trade_id in (select trade_id from sales_trade st where (st.trade_status=30 or st.trade_status=35)) and sto.spec_id=ss.spec_id);
2018年7月8日 19:08