【问题标题】:Updating a table to increment a value per user id更新表以增加每个用户 ID 的值
【发布时间】:2019-02-25 20:14:57
【问题描述】:

我有下表(称为 node_items):

id  node_id position
==  ======= ========
1      1       1
2      1       1
3      2       1
4      2       1
5      2       1
6      2       1
7      3       1
8      3       1
9      3       1
10     3       1

position 字段应该标记节点中的项目位置。它们目前都设置在1。我想通过为每个 node_id 的每个项目设置一个增量位置来修复此表。所以,我追求的结果是:

id  node_id position
==  ======= ========
1      1       1
2      1       2
3      2       1
4      2       2
5      2       3
6      2       4
7      2       5
8      3       1
9      3       2
10     3       3

所以我需要以某种方式按 node_id 对每个项目进行分组,并将位置设置为初始值 1,并为具有该 node_id 的每个后续项目递增它。

注意:为了让我的解释简单,上面的 node_ids 按顺序显示(1,1,2,2,2,2,2,3,3,3),但通常情况并非如此。

我可以使用什么查询来增量更新每个 node_id 的位置值?

【问题讨论】:

    标签: mysql sql-update


    【解决方案1】:

    可以使用 UPDATE 修复表一次:

    SET @n = 0, @p = 1;
    
    UPDATE node_items
    SET position = (@p := IF(node_id=@n, @p+1, 1)),
        node_id = (@n := node_id)
    ORDER BY node_id, id;
    

    在插入/更新/删除数据时使表维护位置值更难。基本上,在允许并发更新时不能这样做。您必须在需要写入表的每个会话中锁定表。这使得并发会话串行运行。

    你可以在这里阅读我的旧帖子:Some sort of “different auto-increment indexes” per a primary key values

    【讨论】:

      猜你喜欢
      • 2023-02-03
      • 2012-11-18
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2011-12-20
      • 2014-07-23
      相关资源
      最近更新 更多