我有一个很大的订单表。有几十万条订单记录的订单表,最近添加了一个新列 invoice_no,我需要为旧订单记录创建基于 distinct (user_id,seller, addtime) 的 invoice_no 值。
CREATE TABLE `TEST_ORDER`(
`ORDER_ID` INT(11),
`USER_ID` INT(11),
`SELLER` VARCHAR(50),
`ADDTIME` INT(11),
`GOODS_NAME` VARCHAR(50),
`PRICE` FLOAT(11,2),
`INVOICE_NO` INT(11)
);
INSERT into `TEST_ORDER` (`ORDER_ID`, `USER_ID`, `SELLER`, `ADDTIME`,
`GOODS_NAME`, `PRICE`, `INVOICE_NO`)
values('1','1','AMAZON','1399109546','BOOK 1','10',NULL);
INSERT into `TEST_ORDER` (`ORDER_ID`, `USER_ID`, `SELLER`, `ADDTIME`,
`GOODS_NAME`, `PRICE`, `INVOICE_NO`)
values('2','1','AMAZON','1399109546','BOOK 2','20','NULL');
INSERT into `TEST_ORDER` (`ORDER_ID`, `USER_ID`, `SELLER`, `ADDTIME`,
`GOODS_NAME`, `PRICE`, `INVOICE_NO`)
values('3','2','EBAY','1438582766','BOOK 3','10',NULL);
INSERT into `TEST_ORDER` (`ORDER_ID`, `USER_ID`, `SELLER`, `ADDTIME`,
`GOODS_NAME`, `PRICE`, `INVOICE_NO`)
values('4','2','EBAY','1438582766','BOOK 4','20',NULL);
INSERT into `TEST_ORDER` (`ORDER_ID`, `USER_ID`, `SELLER`, `ADDTIME`,
`GOODS_NAME`, `PRICE`, `INVOICE_NO`)
values('5','3','AMAZON','1399109546','BOOK 1','10',NULL);
预期结果
这可以通过正常的更新 sql 查询来完成,还是我需要编写一个存储过程并循环每个订单记录以检查订单是否属于同一个 invoice_no?
最佳答案
是的,这可以通过一个更新命令来完成,但是您需要应用一些技巧来使用不同的数据获取发票的运行数量,然后使用自连接进行更新。查询看起来像
update TEST_ORDER t1
join (
select
ORDER_ID,
@rn:= if ( (@prev_uid = USER_ID && @prev_seller = SELLER && @prev_addtime = ADDTIME),@rn,@rn+1) as rn,
@prev_uid:= USER_ID,
@prev_seller:= SELLER,
@prev_addtime:= ADDTIME
from TEST_ORDER , (select @rn:=0,@prev_uid:=0,@prev_seller=null,@prev_addtime:=null)x
order by USER_ID,SELLER,ADDTIME
)t2
on t1.ORDER_ID = t2.ORDER_ID
set t1.INVOICE_NO = t2.rn
这是一个演示
mysql> select * from TEST_ORDER ;
+----------+---------+--------+------------+------------+-------+------------+
| ORDER_ID | USER_ID | SELLER | ADDTIME | GOODS_NAME | PRICE | INVOICE_NO |
+----------+---------+--------+------------+------------+-------+------------+
| 1 | 1 | AMAZON | 1399109546 | BOOK 1 | 10.00 | NULL |
| 2 | 1 | AMAZON | 1399109546 | BOOK 2 | 20.00 | NULL |
| 3 | 2 | EBAY | 1438582766 | BOOK 3 | 10.00 | NULL |
| 4 | 2 | EBAY | 1438582766 | BOOK 4 | 20.00 | NULL |
| 5 | 3 | AMAZON | 1399109546 | BOOK 1 | 10.00 | NULL |
+----------+---------+--------+------------+------------+-------+------------+
mysql> update TEST_ORDER t1
-> join (
-> select
-> ORDER_ID,
-> @rn:= if ( (@prev_uid = USER_ID && @prev_seller = SELLER && @prev_addtime = ADDTIME),@rn,@rn+1) as rn,
-> @prev_uid:= USER_ID,
-> @prev_seller:= SELLER,
-> @prev_addtime:= ADDTIME
-> from TEST_ORDER , (select @rn:=0,@prev_uid:=0,@prev_seller=null,@prev_addtime:=null)x
-> order by USER_ID,SELLER,ADDTIME
-> )t2
-> on t1.ORDER_ID = t2.ORDER_ID
-> set t1.INVOICE_NO = t2.rn;
Query OK, 5 rows affected (0.04 sec)
Rows matched: 5 Changed: 5 Warnings: 0
mysql> select * from TEST_ORDER ;
+----------+---------+--------+------------+------------+-------+------------+
| ORDER_ID | USER_ID | SELLER | ADDTIME | GOODS_NAME | PRICE | INVOICE_NO |
+----------+---------+--------+------------+------------+-------+------------+
| 1 | 1 | AMAZON | 1399109546 | BOOK 1 | 10.00 | 1 |
| 2 | 1 | AMAZON | 1399109546 | BOOK 2 | 20.00 | 1 |
| 3 | 2 | EBAY | 1438582766 | BOOK 3 | 10.00 | 2 |
| 4 | 2 | EBAY | 1438582766 | BOOK 4 | 20.00 | 2 |
| 5 | 3 | AMAZON | 1399109546 | BOOK 1 | 10.00 | 3 |
+----------+---------+--------+------------+------------+-------+------------+
5 rows in set (0.00 sec)
关于Mysql根据非重复列更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32557205/