id item_id item_order
--- ---------- -----------
1 1 0
2 1 0
3 1 0
4 2 0
5 2 0
6 2 0
7 3 0
8 3 0
9 3 0
10 3 0
Run Code Online (Sandbox Code Playgroud)
如何使用MySQL statement将order字段更新为:
id item_id item_order
--- ---------- -----------
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 3 3
10 3 4
Run Code Online (Sandbox Code Playgroud)
子查询可以提供优雅的解决方案.假设您的表被调用test:
UPDATE test a SET item_order = (
SELECT count(*) FROM ( SELECT id, item_id FROM test ) b
WHERE a.item_id = b.item_id AND b.id <= a.id
)
Run Code Online (Sandbox Code Playgroud)
这个怎么运作?对于每一行,它将查询具有相同item_id和更低或相等id的行数.这可能不像其他解决方案那样可扩展,我还没有测试,但对于较小的表,这更容易理解和更新.
请注意,这b是另一个子查询.这将迫使MySQL创建一个内部临时表,以便它不会抱怨我们正在从我们正在更新的表中读取.