更新表以增加每个用户ID的值

时间:2019-02-25 20:14:58

标签: mysql sql-update

我有下表(称为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_id按顺序显示(1、2、2、2、2、2、2、3、3、3),但这通常不是这种情况。 / p>

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

1 个答案:

答案 0 :(得分: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