相对于帐户的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