相对于帐户的MySql增量订单ID
考虑到表相对于帐户的MySql增量订单ID,mysql,sql,sql-update,Mysql,Sql,Sql Update,考虑到表订单: +-----------+----------------+ | AccountID | AccountOrderID | +-----------+----------------+ | 1 | NULL | | 5 | NULL | | 1 | NULL | | 6 | NULL | | 5 | N
订单
:
+-----------+----------------+
| AccountID | AccountOrderID |
+-----------+----------------+
| 1 | NULL |
| 5 | NULL |
| 1 | NULL |
| 6 | NULL |
| 5 | NULL |
| 2 | NULL |
| 6 | NULL |
| 4 | NULL |
| 4 | NULL |
| 5 | NULL |
+-----------+----------------+
如何将增量ID分配给相对于帐户ID
的AccountOrderID
,从而产生如下结果:
+-----------+----------------+
| AccountID | AccountOrderID |
+-----------+----------------+
| 1 | 1 |
| 5 | 1 |
| 1 | 2 |
| 6 | 1 |
| 5 | 2 |
| 2 | 1 |
| 6 | 2 |
| 4 | 1 |
| 4 | 2 |
| 5 | 3 |
+-----------+----------------+
到目前为止,我使用的是用户
和一个名为LastOrderID
的列,并使用一个触发器将其与AccountOrderID
一起递增(这很好):
但是我相信users
表不应该用于此目的:是否有其他方法可以实现此结果
编辑
即使这正是GMB所说的,这里有一个答案提供了一个类似的例子:如果您运行的是MySQL 8.0,您可以使用
行数()。但是您需要另一列以使排序一致。假设表的主键是order\u id
,则可以执行以下操作:
select
order_id,
account_id,
row_number() over(partition by account_id order by order_id) account_order_id
from orders
乍一看,我并不建议实际存储这些数字,因为这样您就需要维护派生的信息—您可以创建一个视图。但由于您要求进行更新
查询:
update orders o
inner join (
select
order_id,
row_number() over(partition by account_id order by order_id) account_order_id
from orders
) o1 on o1.order_id = o.order_id
set o.account_order_id = o1.account_order_id
请注意,这会立即更新整个表(而原始解决方案在存储过程中有一个循环);SQL是一种基于集合的语言,通常不需要循环。工作起来很有魅力!我想知道是否可以对每个AccountOrderID
使用MAX()
对每个AccountID
使用某种方式,并且只对那些具有空值的应用过滤器,以及它是否可以提高性能(希望有意义)。非常感谢。
update orders o
inner join (
select
order_id,
row_number() over(partition by account_id order by order_id) account_order_id
from orders
) o1 on o1.order_id = o.order_id
set o.account_order_id = o1.account_order_id