Mysql根据非重复列更新列

标签 mysql insert-update

我有一个很大的订单表。有几十万条订单记录的订单表,最近添加了一个新列 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);

预期结果

enter image description here

这可以通过正常的更新 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/

相关文章:

mysql - 以编程方式重新排序 SQL 列?

php - 如何使用子查询从两个表中获取值?

mysql - 如何在Visual Studio中连接mysql(基于EC2实例)?

sql - Oracle SQL 根据匹配 ID 更新表

javascript - CouchDB 更新处理程序 : doc update/insert using Nano

mysql - 删除精确的重复记录(也具有相同的 id)但保留一条

MySQL 不同时期的平均值更新

azure - 如何使用 Azure 数据工厂 v2 在 Azure SQL 数据库的所有表中更新插入/插入记录

mysql - 在 MySQL 表中同时插入和更新转义字符、单引号和双引号

php - 我正在尝试更新一个表并从不同的表中调用另一行