我有下表(称为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的位置值?
答案 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